@@ -1,6 +1,5 @@
1module Idris.Erasure
1module Idris.Erasure
2 ( findUnusedArgs
2 ( findUnusedArgs
6import Idris.AbsSyntax
5import Idris.AbsSyntax
@@ -8,6 +7,7 @@ import Idris.AbsSyntax
8import Idris.Core.CaseTree
7import Idris.Core.CaseTree
9import Idris.Core.TT
8import Idris.Core.TT
10+import Control.Applicative
11import Control.Monad.State
11import Control.Monad.State
12import Data.Maybe
12import Data.Maybe
13import Data.List
13import Data.List
@@ -16,26 +16,25 @@ findUnusedArgs :: [Name] -> Idris ()
16findUnusedArgs ns = mapM_ traceUnused ns
16findUnusedArgs ns = mapM_ traceUnused ns
18traceUnused :: Name -> Idris ()
18traceUnused :: Name -> Idris ()
19−traceUnused n
19+traceUnused n = do
20− = do i <- getIState
20+ i <- getIState
21− case lookupCtxt n (idris_callgraph i) of
21+ case lookupCtxt n (idris_callgraph i) of
22− [CGInfo args calls scg usedns _] ->
22+ [CGInfo args calls scg usedns _] -> do
23− do let argpos = zip args [0..]
23+ let argpos = zip args [0..]
24− let fargs = concatMap (getFargpos calls) argpos
24+ let fargs = concatMap (getFargpos calls) argpos
25− logLvl 3 $ show n ++ " used TRACE: " ++ show fargs
25+ logLvl 3 $ show n ++ " used TRACE: " ++ show fargs
26− recused <- mapM (\ (argn, i, (g, j)) ->
26+ recused <- mapM getUsed fargs
27− do u <- used [(n, i)] g j
28− return (argn, u)) fargs
29− logLvl 4 $ show n ++ " recused TRACE: " ++ show recused
30− let fused = nub $ usedns ++ map fst (filter snd recused)
27+ let fused = nub $ usedns ++ map fst (filter snd recused)
31− logLvl 1 $ show n ++ " used args: " ++ show fused
28+ logLvl 1 $ show n ++ " used args: " ++ show fused
32− let unusedpos = mapMaybe (getUnused fused) (zip [0..] args)
29+ let unusedpos = mapMaybe (getUnused fused) (zip [0..] args)
33− logLvl 1 $ show n ++ " unused args: " ++ show (args, unusedpos)
30+ logLvl 1 $ show n ++ " unused args: " ++ show (args, unusedpos)
34− addToCG n (CGInfo args calls scg usedns unusedpos) -- updates
31+ addToCG n (CGInfo args calls scg usedns unusedpos) -- updates
35− _ -> return ()
32+ _ -> return ()
34+ getUsed (argn, i, (g, j)) = (,) argn <$> used [(n,i)] g j
35+ getUnused fused (i,n)
37− getUnused fused (i,n) | n `elem` fused = Nothing
36+ | n `elem` fused = Nothing
38− | otherwise = Just i
37+ | otherwise = Just i
40used :: [(Name, Int)] -> Name -> Int -> Idris Bool
39used :: [(Name, Int)] -> Name -> Int -> Idris Bool
41used path g j
40used path g j