@@ -14,26 +14,30 @@ import Data.List
1414import qualified Data.Set as S
1515
1616findUnusedArgs :: [Name] -> Idris ()
17−findUnusedArgs = mapM_ (\n -> withContext_ idris_callgraph n $ traceUnused n)
18−
19−traceUnused :: Name -> CGInfo -> Idris ()
20−traceUnused n (CGInfo args calls scg usedns _) = do
21− logLvl 3 $ show n ++ " used TRACE: " ++ show fargs
22− recused <- recUsed . idris_callgraph <$> getIState
23− let fused = nub $ usedns ++ recused
24− logLvl 1 $ show n ++ " used args: " ++ show fused
25− let unused = findIndices (not . (`elem` fused)) args
26− logLvl 1 $ show n ++ " unused args: " ++ show (args, unused)
27− addToCG n (CGInfo args calls scg usedns unused) -- updates
17+findUnusedArgs names = do
18+ cg <- idris_callgraph <$> getIState
19+ mapM_ (process cg) names
2820 where
29− fargs = concatMap (getFargpos calls) (zip args [0..])
30− recUsed cg = [n | (n, i, (g,j)) <- fargs, used cg [(n,i)] g j]
21+ process cg n = case lookupCtxt n cg of
22+ [x] -> do
23+ let unused = traceUnused cg n x
24+ logLvl 1 $ show n ++ " unused: " ++ show unused
25+ addToCG n $ x{ unusedpos = unused }
26+ _ -> return ()
3127
28+traceUnused :: Ctxt CGInfo -> Name -> CGInfo -> [Int]
29+traceUnused cg n (CGInfo args calls _ usedns _)
30+ = findIndices (not . (`elem` fused)) args
31+ where
32+ fargs = concatMap (getFargpos calls) (zip args [0..])
33+ recused = [n | (n, i, (g,j)) <- fargs, used cg [(n,i)] g j]
34+ fused = nub $ usedns ++ recused
35+
3236used :: Ctxt CGInfo -> [(Name, Int)] -> Name -> Int -> Bool
3337used cg path g j
3438 | (g, j) `elem` path = False -- cycle, never used on the way
3539 | otherwise = case lookupCtxt g cg of
36− [CGInfo args calls scg usedns unused] ->
40+ [CGInfo args calls _ usedns _] ->
3741 if j >= length args
3842 then True -- overapplied, assume used
3943 else