@@ -0,0 +1,99 @@
1+module Generate.Nitpick
7+import qualified Data.Map as Map
8+import qualified Data.Set as Set
10+import qualified AST.Optimized as Opt
11+import qualified AST.Module.Name as ModuleName
12+import qualified Elm.Package as Pkg
13+import qualified Elm.Name as N
20+findDebugUses :: Pkg.Name -> Opt.Graph -> [N.Name]
21+findDebugUses pkg (Opt.Graph _ graph _) =
22+ Set.toList $ Map.foldrWithKey (addDebugUses pkg) Set.empty graph
25+addDebugUses :: Pkg.Name -> Opt.Global -> Opt.Node -> Set.Set N.Name -> Set.Set N.Name
26+addDebugUses here (Opt.Global (ModuleName.Canonical pkg home) _) node uses =
27+ if pkg == here && nodeHasDebug node then
33+nodeHasDebug :: Opt.Node -> Bool
36+ Opt.Define expr _ -> hasDebug expr
37+ Opt.DefineTailFunc _ expr _ -> hasDebug expr
38+ Opt.Ctor _ _ _ -> False
39+ Opt.Enum _ _ -> False
42+ Opt.Cycle defs _ -> any (hasDebug . snd) defs
43+ Opt.Manager _ -> False
44+ Opt.Kernel _ _ -> False
45+ Opt.PortIncoming expr _ -> hasDebug expr
46+ Opt.PortOutgoing expr _ -> hasDebug expr
49+hasDebug :: Opt.Expr -> Bool
57+ Opt.VarLocal _ -> False
58+ Opt.VarGlobal _ -> False
59+ Opt.VarEnum _ _ -> False
60+ Opt.VarBox _ -> False
61+ Opt.VarCycle _ _ -> False
62+ Opt.VarDebug _ _ _ _ -> True
63+ Opt.VarKernel _ _ -> False
64+ Opt.List exprs -> any hasDebug exprs
65+ Opt.Function _ expr -> hasDebug expr
66+ Opt.Call e es -> hasDebug e || any hasDebug es
67+ Opt.TailCall _ args -> any (hasDebug . snd) args
68+ Opt.If conds finally -> any (\(c,e) -> hasDebug c || hasDebug e) conds || hasDebug finally
69+ Opt.Let def body -> defHasDebug def || hasDebug body
70+ Opt.Destruct _ expr -> hasDebug expr
71+ Opt.Case _ _ d jumps -> deciderHasDebug d || any (hasDebug . snd) jumps
72+ Opt.Accessor _ -> False
73+ Opt.Access r _ -> hasDebug r
74+ Opt.Update r fs -> hasDebug r || any hasDebug fs
75+ Opt.Record fs -> any hasDebug fs
77+ Opt.Tuple a b c -> hasDebug a || hasDebug b || maybe False hasDebug c
78+ Opt.Shader _ -> False
81+defHasDebug :: Opt.Def -> Bool
84+ Opt.Def _ expr -> hasDebug expr
85+ Opt.TailDef _ _ expr -> hasDebug expr
88+deciderHasDebug :: Opt.Decider Opt.Choice -> Bool
89+deciderHasDebug decider =
91+ Opt.Leaf (Opt.Inline expr) -> hasDebug expr
92+ Opt.Leaf (Opt.Jump _) -> False
93+ Opt.Chain _ success failure -> deciderHasDebug success || deciderHasDebug failure
94+ Opt.FanOut _ tests fallback -> any (deciderHasDebug . snd) tests || deciderHasDebug fallback
98+-- TODO: FIND GLOBALLY UNUSED DEFINITIONS?
99+-- TODO: FIND PACKAGE USAGE STATS? (e.g. elm-lang/core = 142, author/project = 2, etc.)