@@ -8,12 +8,10 @@ import Data.List as List
88import qualified Data.Map as Map
99import qualified Data.Maybe as Maybe
1010import qualified Data.Set as Set
11−import Data.Data
12−import Data.Generics.Uniplate.Data
1311import Text.PrettyPrint as P
1412
1513
16−mistakes :: (Data t, Data v) => [Declaration t v] -> [Doc]
14+mistakes :: [Declaration t v] -> [Doc]
1715mistakes decls =
1816 concat [ infiniteTypeAliases decls
1917 , illFormedTypes decls
@@ -22,15 +20,35 @@ mistakes decls =
2220 where
2321 findErrors defs = duplicates defs ++ badOrder defs
2422
25−getLets :: (Data t, Data v) => [Declaration t v] -> [[Def t v]]
26−getLets decls = defs : concatMap getSubLets defs
23+getLets :: [Declaration t v] -> [[Def t v]]
24+getLets decls = defs : concatMap defLets defs
2725 where
28− defs = concatMap (\d -> case d of Definition d -> [d] ; _ -> []) decls
26+ defs = [ d | Definition d <- decls ]
2927
30− getSubLets def =
28+ defLets def =
3129 case def of
32− Def pattern expr -> [ defs | Let defs _ <- universeBi expr ]
3330 TypeAnnotation _ _ -> []
31+ Def _ expr -> exprLets expr
32+
33+ exprLets (L _ expr) =
34+ case expr of
35+ Var _ -> []
36+ Lambda p e -> exprLets e
37+ Binop op e1 e2 -> exprLets e1 ++ exprLets e2
38+ Case e cases -> exprLets e ++ concatMap (exprLets . snd) cases
39+ Data name es -> concatMap exprLets es
40+ Literal _ -> []
41+ Range e1 e2 -> exprLets e1 ++ exprLets e2
42+ ExplicitList es -> concatMap exprLets es
43+ App e1 e2 -> exprLets e1 ++ exprLets e2
44+ MultiIf branches -> concatMap (\(b,e) -> exprLets b ++ exprLets e) branches
45+ Access e lbl -> exprLets e
46+ Remove e lbl -> exprLets e
47+ Insert e lbl v -> exprLets e ++ exprLets v
48+ Modify e fields -> exprLets e ++ concatMap (exprLets . snd) fields
49+ Record fields -> concatMap (exprLets . snd) fields
50+ Markdown uid md es -> []
51+ Let defs body -> [defs] ++ exprLets body
3452
3553dups :: Eq a => [a] -> [a]
3654dups = map head . filter ((>1) . length) . List.group