@@ -874,21 +874,21 @@ expandParams dec ps ns infs tm = en tm
874 mkShadow (MN i n) = MN (i+1) n
874 mkShadow (MN i n) = MN (i+1) n
875 mkShadow (NS x s) = NS (mkShadow x) s
875 mkShadow (NS x s) = NS (mkShadow x) s
877− en (PLam n t s)
877+ en (PLam fc n t s)
878 | n `elem` (map fst ps ++ ns)
878 | n `elem` (map fst ps ++ ns)
879 = let n' = mkShadow n in
879 = let n' = mkShadow n in
880− PLam n' (en t) (en (shadow n n' s))
880+ PLam fc n' (en t) (en (shadow n n' s))
881− | otherwise = PLam n (en t) (en s)
881+ | otherwise = PLam fc n (en t) (en s)
882 en (PPi p n t s)
882 en (PPi p n t s)
883 | n `elem` (map fst ps ++ ns)
883 | n `elem` (map fst ps ++ ns)
884 = let n' = mkShadow n in -- TODO THINK SHADOWING TacImp?
884 = let n' = mkShadow n in -- TODO THINK SHADOWING TacImp?
885 PPi (enTacImp p) n' (en t) (en (shadow n n' s))
885 PPi (enTacImp p) n' (en t) (en (shadow n n' s))
886 | otherwise = PPi (enTacImp p) n (en t) (en s)
886 | otherwise = PPi (enTacImp p) n (en t) (en s)
887− en (PLet n ty v s)
887+ en (PLet fc n ty v s)
888 | n `elem` (map fst ps ++ ns)
888 | n `elem` (map fst ps ++ ns)
889 = let n' = mkShadow n in
889 = let n' = mkShadow n in
890− PLet n' (en ty) (en v) (en (shadow n n' s))
890+ PLet fc n' (en ty) (en v) (en (shadow n n' s))
891− | otherwise = PLet n (en ty) (en v) (en s)
891+ | otherwise = PLet fc n (en ty) (en v) (en s)
892 -- FIXME: Should only do this in a type signature!
892 -- FIXME: Should only do this in a type signature!
893 en (PDPair f p (PRef f' n) t r)
893 en (PDPair f p (PRef f' n) t r)
894 | n `elem` (map fst ps ++ ns) && t /= Placeholder
894 | n `elem` (map fst ps ++ ns) && t /= Placeholder
@@ -1396,7 +1396,7 @@ implicitise syn ignore ist tm = -- trace ("INCOMING " ++ showImp True tm) $
1396 = do (decls, ns) <- get
1396 = do (decls, ns) <- get
1397 let isn = concatMap (namesIn uvars ist) as
1397 let isn = concatMap (namesIn uvars ist) as
1398 put (decls, nub (ns ++ (isn `dropAll` (env ++ map fst (getImps decls)))))
1398 put (decls, nub (ns ++ (isn `dropAll` (env ++ map fst (getImps decls)))))
1399− imps top env (PLam n ty sc)
1399+ imps top env (PLam fc n ty sc)
1400 = do imps False env ty
1400 = do imps False env ty
1401 imps False (n:env) sc
1401 imps False (n:env) sc
1402 imps top env (PHidden tm) = imps False env tm
1402 imps top env (PHidden tm) = imps False env tm
@@ -1488,15 +1488,24 @@ addImpl' inpat env infns ist ptm
1488 -- definition which is passed through addImpl again with more scope
1488 -- definition which is passed through addImpl again with more scope
1489 -- information
1489 -- information
1490 PCase fc c' os
1490 PCase fc c' os
1491+ -- If the name in a lambda is a constructor name, do this as a 'case'
1492+ -- instead (it is harmless to do so, especially since the lambda will
1493+ -- be lifted anyway!)
1491− ai qq env ds (PLam n ty sc)
1494+ ai qq env ds (PLam fc n ty sc)
1495+ = case lookupDef n (tt_ctxt ist) of
1492− = let ty' = ai qq env ds ty
1496+ [] -> let ty' = ai qq env ds ty
1493− sc' = ai qq ((n, Just ty):env) ds sc in
1497+ sc' = ai qq ((n, Just ty):env) ds sc in
1494− PLam n ty' sc'
1498+ PLam fc n ty' sc'
1499+ _ -> ai qq env ds (PLam fc (sMN 0 "lamp") ty
1500+ (PCase fc (PRef fc (sMN 0 "lamp") )
1501+ [(PRef fc n, sc)]))
1495− ai qq env ds (PLet n ty val sc)
1502+ ai qq env ds (PLet fc n ty val sc)
1503+ = case lookupDef n (tt_ctxt ist) of
1496− = let ty' = ai qq env ds ty
1504+ [] -> let ty' = ai qq env ds ty
1497− val' = ai qq env ds val
1505+ val' = ai qq env ds val
1498− sc' = ai qq ((n, Just ty):env) ds sc in
1506+ sc' = ai qq ((n, Just ty):env) ds sc in
1499− PLet n ty' val' sc'
1507+ PLet fc n ty' val' sc'
1508+ _ -> ai qq env ds (PCase fc val [(PRef fc n, sc)])
1500 ai qq env ds (PPi p n ty sc)
1509 ai qq env ds (PPi p n ty sc)
1501 = let ty' = ai qq env ds ty
1510 = let ty' = ai qq env ds ty
1502 sc' = ai qq ((n, Just ty):env) ds sc in
1511 sc' = ai qq ((n, Just ty):env) ds sc in
@@ -1696,7 +1705,7 @@ stripUnmatchable i (PApp fc fn args) = PApp fc fn (fmap (fmap su) args) where
1696 else PAlternative b alts'
1705 else PAlternative b alts'
1697 su (PPair fc p l r) = PPair fc p (su l) (su r)
1706 su (PPair fc p l r) = PPair fc p (su l) (su r)
1698 su (PDPair fc p l t r) = PDPair fc p (su l) (su t) (su r)
1707 su (PDPair fc p l t r) = PDPair fc p (su l) (su t) (su r)
1699− su t@(PLam _ _ _) = PHidden t
1708+ su t@(PLam fc _ _ _) = PHidden t
1700 su t@(PPi _ _ _ _) = PHidden t
1709 su t@(PPi _ _ _ _) = PHidden t
1701 su t@(PEq _ _ _ _ _) = PHidden t
1710 su t@(PEq _ _ _ _ _) = PHidden t
1702 su t = t
1711 su t = t
@@ -1843,13 +1852,13 @@ matchClause' names i x y = checkRpts $ match (fullApp x) (fullApp y) where
1843 match (PPi _ _ t s) (PPi _ _ t' s') = do mt <- match' t t'
1852 match (PPi _ _ t s) (PPi _ _ t' s') = do mt <- match' t t'
1844 ms <- match' s s'
1853 ms <- match' s s'
1845 return (mt ++ ms)
1854 return (mt ++ ms)
1846− match (PLam _ t s) (PLam _ t' s') = do mt <- match' t t'
1855+ match (PLam _ _ t s) (PLam _ _ t' s') = do mt <- match' t t'
1847− ms <- match' s s'
1856+ ms <- match' s s'
1848− return (mt ++ ms)
1857+ return (mt ++ ms)
1849− match (PLet _ t ty s) (PLet _ t' ty' s') = do mt <- match' t t'
1858+ match (PLet _ _ t ty s) (PLet _ _ t' ty' s') = do mt <- match' t t'
1850− mty <- match' ty ty'
1859+ mty <- match' ty ty'
1851− ms <- match' s s'
1860+ ms <- match' s s'
1852− return (mt ++ mty ++ ms)
1861+ return (mt ++ mty ++ ms)
1853 match (PHidden x) (PHidden y)
1862 match (PHidden x) (PHidden y)
1854 | RightOK xs <- match x y = return xs -- to collect variables
1863 | RightOK xs <- match x y = return xs -- to collect variables
1855 | otherwise = return [] -- Otherwise hidden things are unmatchable
1864 | otherwise = return [] -- Otherwise hidden things are unmatchable
@@ -1892,7 +1901,7 @@ substMatch n = substMatchShadow n []
1892substMatchShadow :: Name -> [Name] -> PTerm -> PTerm -> PTerm
1901substMatchShadow :: Name -> [Name] -> PTerm -> PTerm -> PTerm
1893substMatchShadow n shs tm t = sm shs t where
1902substMatchShadow n shs tm t = sm shs t where
1894 sm xs (PRef _ n') | n == n' = tm
1903 sm xs (PRef _ n') | n == n' = tm
1895− sm xs (PLam x t sc) = PLam x (sm xs t) (sm xs sc)
1904+ sm xs (PLam fc x t sc) = PLam fc x (sm xs t) (sm xs sc)
1896 sm xs (PPi p x t sc)
1905 sm xs (PPi p x t sc)
1897 | x `elem` xs
1906 | x `elem` xs
1898 = let x' = nextName x in
1907 = let x' = nextName x in
@@ -1919,9 +1928,9 @@ substMatchShadow n shs tm t = sm shs t where
1919shadow :: Name -> Name -> PTerm -> PTerm
1928shadow :: Name -> Name -> PTerm -> PTerm
1920shadow n n' t = sm t where
1929shadow n n' t = sm t where
1921 sm (PRef fc x) | n == x = PRef fc n'
1930 sm (PRef fc x) | n == x = PRef fc n'
1922− sm (PLam x t sc) | n /= x = PLam x (sm t) (sm sc)
1931+ sm (PLam fc x t sc) | n /= x = PLam fc x (sm t) (sm sc)
1923 sm (PPi p x t sc) | n /=x = PPi p x (sm t) (sm sc)
1932 sm (PPi p x t sc) | n /=x = PPi p x (sm t) (sm sc)
1924− sm (PLet x t v sc) | n /= x = PLet x (sm t) (sm v) (sm sc)
1933+ sm (PLet fc x t v sc) | n /= x = PLet fc x (sm t) (sm v) (sm sc)
1925 sm (PApp f x as) = PApp f (sm x) (map (fmap sm) as)
1934 sm (PApp f x as) = PApp f (sm x) (map (fmap sm) as)
1926 sm (PAppBind f x as) = PAppBind f (sm x) (map (fmap sm) as)
1935 sm (PAppBind f x as) = PAppBind f (sm x) (map (fmap sm) as)
1927 sm (PCase f x as) = PCase f (sm x) (map (pmap sm) as)
1936 sm (PCase f x as) = PCase f (sm x) (map (pmap sm) as)
@@ -1960,7 +1969,7 @@ mkUniqueNames env tm = evalState (mkUniq tm) (S.fromList env) where
1960 mkUniqT tac = return tac
1969 mkUniqT tac = return tac
1962 mkUniq :: PTerm -> State (S.Set Name) PTerm
1971 mkUniq :: PTerm -> State (S.Set Name) PTerm
1963− mkUniq (PLam n ty sc)
1972+ mkUniq (PLam fc n ty sc)
1964 = do env <- get
1973 = do env <- get
1965 (n', sc') <-
1974 (n', sc') <-
1966 if n `S.member` env
1975 if n `S.member` env
@@ -1971,7 +1980,7 @@ mkUniqueNames env tm = evalState (mkUniq tm) (S.fromList env) where
1971 put (S.insert n' env)
1980 put (S.insert n' env)
1972 ty' <- mkUniq ty
1981 ty' <- mkUniq ty
1973 sc'' <- mkUniq sc'
1982 sc'' <- mkUniq sc'
1974− return $! PLam n' ty' sc''
1983+ return $! PLam fc n' ty' sc''
1975 mkUniq (PPi p n ty sc)
1984 mkUniq (PPi p n ty sc)
1976 = do env <- get
1985 = do env <- get
1977 (n', sc') <-
1986 (n', sc') <-
@@ -1984,7 +1993,7 @@ mkUniqueNames env tm = evalState (mkUniq tm) (S.fromList env) where
1984 ty' <- mkUniq ty
1993 ty' <- mkUniq ty
1985 sc'' <- mkUniq sc'
1994 sc'' <- mkUniq sc'
1986 return $! PPi p n' ty' sc''
1995 return $! PPi p n' ty' sc''
1987− mkUniq (PLet n ty val sc)
1996+ mkUniq (PLet fc n ty val sc)
1988 = do env <- get
1997 = do env <- get
1989 (n', sc') <-
1998 (n', sc') <-
1990 if n `S.member` env
1999 if n `S.member` env
@@ -1995,7 +2004,7 @@ mkUniqueNames env tm = evalState (mkUniq tm) (S.fromList env) where
1995 put (S.insert n' env)
2004 put (S.insert n' env)
1996 ty' <- mkUniq ty; val' <- mkUniq val
2005 ty' <- mkUniq ty; val' <- mkUniq val
1997 sc'' <- mkUniq sc'
2006 sc'' <- mkUniq sc'
1998− return $! PLet n' ty' val' sc''
2007+ return $! PLet fc n' ty' val' sc''
1999 mkUniq (PApp fc t args)
2008 mkUniq (PApp fc t args)
2000 = do t' <- mkUniq t
2009 = do t' <- mkUniq t
2001 args' <- mapM mkUniqA args
2010 args' <- mapM mkUniqA args