@@ -21,8 +21,7 @@ mistakes decls =
2121 concat [ infiniteTypeAliases decls
2222 , illFormedTypes decls
2323 , map P.text (duplicateConstructors decls)
24− , map P.text (duplicates decls)
25− , badDerivations decls ]
24+ , map P.text (duplicates decls) ]
2625
2726dups :: Ord a => [a] -> [a]
2827dups = map head . filter ((>1) . length) . List.group . List.sort
@@ -67,35 +66,14 @@ duplicateConstructors decls =
6766 map (dupErr "definition of type constructor") (dups typeCtors) ++
6867 map (dupErr "definition of data constructor") (dups dataCtors)
6968 where
70− typeCtors = [ name | D.Datatype name _ _ _ <- decls ]
71− dataCtors = concat [ map fst patterns | D.Datatype _ _ patterns _ <- decls ]
72−
73−badDerivations :: [D.Declaration] -> [Doc]
74−badDerivations decls = concatMap badDerivation derivations
75− where
76− derivations =
77− [ (decl, tvars, derives) | decl@(D.TypeAlias _ tvars _ derives) <- decls ] ++
78− [ (decl, tvars, derives) | decl@(D.Datatype _ tvars _ derives) <- decls ]
79−
80− badDerivation (decl, tvars, derives) =
81− case (tvars, derives) of
82− (_:_, _)
83− | D.Json `elem` derives -> [report decl D.Json]
84− | D.Binary `elem` derives -> [report decl D.Binary]
85− _ -> []
86−
87− report decl derive =
88− P.vcat [ P.text $ "Error: cannot derive '" ++ show derive ++ "' from this type alias."
89− , P.text "Make sure all type variables are replaced with concrete types:"
90− , P.text "\n"
91− , nest 4 (pretty decl)
92− ]
69+ typeCtors = [ name | D.Datatype name _ _ <- decls ]
70+ dataCtors = concat [ map fst patterns | D.Datatype _ _ patterns <- decls ]
9371
9472illFormedTypes :: [D.Declaration] -> [Doc]
9573illFormedTypes decls = map report (Maybe.mapMaybe isIllFormed (aliases ++ adts))
9674 where
97− aliases = [ (decl, tvars, [tipe]) | decl@(D.TypeAlias _ tvars tipe _) <- decls ]
98− adts = [ (decl, tvars, concatMap snd ctors) | decl@(D.Datatype _ tvars ctors _) <- decls ]
75+ aliases = [ (decl, tvars, [tipe]) | decl@(D.TypeAlias _ tvars tipe) <- decls ]
76+ adts = [ (decl, tvars, concatMap snd ctors) | decl@(D.Datatype _ tvars ctors) <- decls ]
9977
10078 freeVars tipe =
10179 case tipe of
@@ -138,8 +116,8 @@ illFormedTypes decls = map report (Maybe.mapMaybe isIllFormed (aliases ++ adts))
138116
139117infiniteTypeAliases :: [D.Declaration] -> [Doc]
140118infiniteTypeAliases decls =
141− [ report name tvars tipe ds | D.TypeAlias name tvars tipe ds <- decls
142− , infiniteType name tipe ]
119+ [ report name tvars tipe | D.TypeAlias name tvars tipe <- decls
120+ , infiniteType name tipe ]
143121 where
144122 infiniteType name tipe =
145123 let infinite = infiniteType name in
@@ -152,11 +130,11 @@ infiniteTypeAliases decls =
152130 indented :: D.Declaration -> Doc
153131 indented decl = P.text "\n " <> pretty decl <> P.text "\n"
154132
155− report name args tipe derivations =
133+ report name args tipe =
156134 P.vcat [ P.text $ eightyCharLines 0 msg1
157− , indented $ D.TypeAlias name args tipe derivations
135+ , indented $ D.TypeAlias name args tipe
158136 , P.text $ eightyCharLines 0 msg2
159− , indented $ D.Datatype name args [(name,[tipe])] derivations
137+ , indented $ D.Datatype name args [(name,[tipe])]
160138 , P.text $ eightyCharLines 0 msg3 ++ "\n"
161139 ]
162140 where