@@ -37,6 +37,12 @@ data UResult a = UOK a
37 | UPartOK a
37 | UPartOK a
38 | UFail Err
38 | UFail Err
40+-- | Smart constructor for unification errors that takes into account the FailContext
41+cantUnify :: [FailContext] -> Bool -> t -> t -> (Err' t) -> [(Name, t)] -> Int -> Err' t
42+cantUnify [] r t1 t2 e ctxt i = CantUnify r t1 t2 e ctxt i
43+cantUnify (FailContext fc f x : _) r t1 t2 e ctxt i =
44+ ElaboratingArg fc f x (CantUnify r t1 t2 e ctxt i)
40-- Solve metavariables by matching terms against each other
46-- Solve metavariables by matching terms against each other
41-- Not really unification, of course!
47-- Not really unification, of course!
@@ -89,7 +95,7 @@ match_unify ctxt env topx topy inj holes from =
89 | OK True <- convEq' ctxt holes x y = do sc 1; return []
95 | OK True <- convEq' ctxt holes x y = do sc 1; return []
90 | otherwise = do UI s f <- get
96 | otherwise = do UI s f <- get
91 let r = recoverable x y
97 let r = recoverable x y
92− let err = CantUnify r
98+ let err = cantUnify from r
93 topx topy (CantUnify r x y (Msg "") (errEnv env) s) (errEnv env) s
99 topx topy (CantUnify r x y (Msg "") (errEnv env) s) (errEnv env) s
94 if (not r) then lift $ tfail err
100 if (not r) then lift $ tfail err
95 else do put (UI s ((x, y, env, err, from, Match) : f))
101 else do put (UI s ((x, y, env, err, from, Match) : f))
@@ -103,9 +109,9 @@ match_unify ctxt env topx topy inj holes from =
103 uB bnames (Pi tx) (Pi ty) = un bnames tx ty
109 uB bnames (Pi tx) (Pi ty) = un bnames tx ty
104 uB bnames x y = do UI s f <- get
110 uB bnames x y = do UI s f <- get
105 let r = recoverable (binderTy x) (binderTy y)
111 let r = recoverable (binderTy x) (binderTy y)
106− let err = CantUnify r topx topy
112+ let err = cantUnify from r topx topy
107− (CantUnify r (binderTy x) (binderTy y) (Msg "") (errEnv env) s)
113+ (CantUnify r (binderTy x) (binderTy y) (Msg "") (errEnv env) s)
108− (errEnv env) s
114+ (errEnv env) s
109 put (UI s ((binderTy x, binderTy y, env, err, from, Match) : f))
115 put (UI s ((binderTy x, binderTy y, env, err, from, Match) : f))
110 return []
116 return []
@@ -117,7 +123,7 @@ match_unify ctxt env topx topy inj holes from =
118 unifyFail x y = do UI s f <- get
124 unifyFail x y = do UI s f <- get
119 let r = recoverable x y
125 let r = recoverable x y
120− let err = CantUnify r
126+ let err = cantUnify from r
121 topx topy (CantUnify r x y (Msg "") (errEnv env) s) (errEnv env) s
127 topx topy (CantUnify r x y (Msg "") (errEnv env) s) (errEnv env) s
122 put (UI s ((x, y, env, err, from, Match) : f))
128 put (UI s ((x, y, env, err, from, Match) : f))
123 lift $ tfail err
129 lift $ tfail err
@@ -370,7 +376,7 @@ unify ctxt env topx topy inj holes from =
370 | OK True <- convEq' ctxt holes x y = do sc 1; return []
376 | OK True <- convEq' ctxt holes x y = do sc 1; return []
371 | otherwise = do UI s f <- get
377 | otherwise = do UI s f <- get
372 let r = recoverable x y
378 let r = recoverable x y
373− let err = CantUnify r
379+ let err = cantUnify from r
374 topx topy (CantUnify r x y (Msg "") (errEnv env) s) (errEnv env) s
380 topx topy (CantUnify r x y (Msg "") (errEnv env) s) (errEnv env) s
375 if (not r) then lift $ tfail err
381 if (not r) then lift $ tfail err
376 else do put (UI s ((x, y, env, err, from, Unify) : f))
382 else do put (UI s ((x, y, env, err, from, Unify) : f))
@@ -470,7 +476,7 @@ unify ctxt env topx topy inj holes from =
470 unifyTmpFail x y
476 unifyTmpFail x y
471 = do UI s f <- get
477 = do UI s f <- get
472 let r = recoverable x y
478 let r = recoverable x y
473− let err = CantUnify r
479+ let err = cantUnify from r
474 topx topy (CantUnify r x y (Msg "") (errEnv env) s) (errEnv env) s
480 topx topy (CantUnify r x y (Msg "") (errEnv env) s) (errEnv env) s
475 put (UI s ((topx, topy, env, err, from, Unify) : f))
481 put (UI s ((topx, topy, env, err, from, Unify) : f))
476 return []
482 return []
@@ -478,7 +484,7 @@ unify ctxt env topx topy inj holes from =
478 -- shortcut failure, if we *know* nothing can fix it
484 -- shortcut failure, if we *know* nothing can fix it
479 unifyFail x y = do UI s f <- get
485 unifyFail x y = do UI s f <- get
480 let r = recoverable x y
486 let r = recoverable x y
481− let err = CantUnify r
487+ let err = cantUnify from r
482 topx topy (CantUnify r x y (Msg "") (errEnv env) s) (errEnv env) s
488 topx topy (CantUnify r x y (Msg "") (errEnv env) s) (errEnv env) s
483 put (UI s ((topx, topy, env, err, from, Unify) : f))
489 put (UI s ((topx, topy, env, err, from, Unify) : f))
484 lift $ tfail err
490 lift $ tfail err
@@ -500,9 +506,9 @@ unify ctxt env topx topy inj holes from =
500 uB bnames (PVar tx) (PVar ty) = un' False bnames tx ty
506 uB bnames (PVar tx) (PVar ty) = un' False bnames tx ty
501 uB bnames x y = do UI s f <- get
507 uB bnames x y = do UI s f <- get
502 let r = recoverable (binderTy x) (binderTy y)
508 let r = recoverable (binderTy x) (binderTy y)
503− let err = CantUnify r topx topy
509+ let err = cantUnify from r topx topy
504− (CantUnify r (binderTy x) (binderTy y) (Msg "") (errEnv env) s)
510+ (CantUnify r (binderTy x) (binderTy y) (Msg "") (errEnv env) s)
505− (errEnv env) s
511+ (errEnv env) s
506 put (UI s ((binderTy x, binderTy y, env, err, from, Unify) : f))
512 put (UI s ((binderTy x, binderTy y, env, err, from, Unify) : f))
507 return [] -- lift $ tfail err
513 return [] -- lift $ tfail err