@@ -8,12 +8,10 @@ import Data.List as List
8import qualified Data.Map as Map
8import qualified Data.Map as Map
9import qualified Data.Maybe as Maybe
9import qualified Data.Maybe as Maybe
10import qualified Data.Set as Set
10import qualified Data.Set as Set
12−import Data.Generics.Uniplate.Data
13import Text.PrettyPrint as P
11import Text.PrettyPrint as P
16−mistakes :: (Data t, Data v) => [Declaration t v] -> [Doc]
14+mistakes :: [Declaration t v] -> [Doc]
17mistakes decls =
15mistakes decls =
18 concat [ infiniteTypeAliases decls
16 concat [ infiniteTypeAliases decls
19 , illFormedTypes decls
17 , illFormedTypes decls
@@ -22,15 +20,35 @@ mistakes decls =
23 findErrors defs = duplicates defs ++ badOrder defs
21 findErrors defs = duplicates defs ++ badOrder defs
25−getLets :: (Data t, Data v) => [Declaration t v] -> [[Def t v]]
23+getLets :: [Declaration t v] -> [[Def t v]]
26−getLets decls = defs : concatMap getSubLets defs
24+getLets decls = defs : concatMap defLets defs
28− defs = concatMap (\d -> case d of Definition d -> [d] ; _ -> []) decls
26+ defs = [ d | Definition d <- decls ]
30− getSubLets def =
28+ defLets def =
31 case def of
29 case def of
32− Def pattern expr -> [ defs | Let defs _ <- universeBi expr ]
33 TypeAnnotation _ _ -> []
30 TypeAnnotation _ _ -> []
31+ Def _ expr -> exprLets expr
33+ exprLets (L _ expr) =
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
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
35dups :: Eq a => [a] -> [a]
53dups :: Eq a => [a] -> [a]
36dups = map head . filter ((>1) . length) . List.group
54dups = map head . filter ((>1) . length) . List.group