@@ -2,6 +2,7 @@
3module Idris.Erasure
3module Idris.Erasure
4 ( findUnusedArgs
4 ( findUnusedArgs
7import Idris.AbsSyntax
8import Idris.AbsSyntax
@@ -53,7 +54,7 @@ findUsed ctx cg = unionMap $ findUsedDef cg . getDef ctx
53 findUsedSC cg vars (UnmatchedCase msg) = M.empty
54 findUsedSC cg vars (UnmatchedCase msg) = M.empty
54 findUsedSC cg vars (Case n alts) = unionMap (findUsedAlt cg vars) alts
55 findUsedSC cg vars (Case n alts) = unionMap (findUsedAlt cg vars) alts
55 findUsedSC cg vars (ProjCase t alt) = findUsedAlt cg vars alt
56 findUsedSC cg vars (ProjCase t alt) = findUsedAlt cg vars alt
56− findUsedSC cg vars (STerm t) = unionMap lookUp $ findUsedTerm cg t
57+ findUsedSC cg vars (STerm t) = unionMap lookUp . S.toList $ findUsedTerm cg t
58 lookUp :: Name -> UseMap
59 lookUp :: Name -> UseMap
59 lookUp n = case M.lookup n vars of
60 lookUp n = case M.lookup n vars of
@@ -61,18 +62,33 @@ findUsed ctx cg = unionMap $ findUsedDef cg . getDef ctx
61 Nothing -> M.empty
62 Nothing -> M.empty
63 findUsedAlt :: Ctxt CGInfo -> PatvarMap -> CaseAlt -> UseMap
64 findUsedAlt :: Ctxt CGInfo -> PatvarMap -> CaseAlt -> UseMap
64− findUsedAlt cg vars (FnCase n ns sc) = findUsedAlt cg vars sc -- TODO: what's this?
65+ findUsedAlt cg vars (FnCase n ns sc) = findUsedSC cg vars sc -- TODO: what's this?
65− findUsedAlt cg vars (ConstCase c sc) = findUsedAlt cg vars sc
66+ findUsedAlt cg vars (ConstCase c sc) = findUsedSC cg vars sc
66− findUsedAlt cg vars (SucCase n sc) = findUsedAlt cg (M.insert n (error "put S here") vars) sc -- TODO
67+ findUsedAlt cg vars (SucCase n sc) = findUsedSC cg (M.insert n (error "put S here") vars) sc -- TODO
67− findUsedAlt cg vars (DefaultCase sc) = findUsedAlt cg vars sc
68+ findUsedAlt cg vars (DefaultCase sc) = findUsedSC cg vars sc
68− findUsedAlt cg vars (ConCase n cnt ns sc) = findUsedAlt cg (ns `u` vars) sc
69+ findUsedAlt cg vars (ConCase n cnt ns sc) = findUsedSC cg (ns `u` vars) sc
70 u :: [Name] -> PatvarMap -> PatvarMap
71 u :: [Name] -> PatvarMap -> PatvarMap
71 vs `u` pmap = M.fromList [(var, (n, i)) | (i, var) <- zip [0..] vs] `M.union` pmap
72 vs `u` pmap = M.fromList [(var, (n, i)) | (i, var) <- zip [0..] vs] `M.union` pmap
74+ -- Find used pattern variables in the given term.
73 findUsedTerm :: Ctxt CGInfo -> Term -> Set Name
75 findUsedTerm :: Ctxt CGInfo -> Term -> Set Name
74− findUsedTerm cg t = undefined
76+ findUsedTerm cg (P _ n _) = S.singleton n
75−
77+ findUsedTerm cg (Bind n (Let t v) body) = S.unions
79+ , S.delete n $ findUsedTerm cg body
80+ , findUsedTerm cg t ]
81+ findUsedTerm cg (Bind n b t) = S.unions
82+ [ findUsedTerm cg (binderTy b)
83+ , S.delete n $ findUsedTerm cg t ]
84+ findUsedTerm cg (Proj t i) = findUsedTerm cg t
85+ findUsedTerm cg t@(App _ _) | (P _ n _, args) <- unApply t
86+ = let unused = case lookupCtxt n cg of
87+ [cgi] -> unusedpos cgi
89+ in S.unions [findUsedTerm cg arg | (i,arg) <- zip [0..] args, i `notElem` unused]
90+ findUsedTerm cg _ = S.empty
76findUnusedArgs :: [Name] -> Idris ()
92findUnusedArgs :: [Name] -> Idris ()
77findUnusedArgs names = do
93findUnusedArgs names = do
78 cg <- idris_callgraph <$> getIState
94 cg <- idris_callgraph <$> getIState