on master help sign in
fix #624 and #799, better error messages and style
db31fe2Evan Czaplicki
src/Transform/Check.hs+41−17
@@ -14,32 +14,38 @@ import qualified AST.Variable as Var
14import qualified Transform.Expression as Expr
14import qualified Transform.Expression as Expr
15
15
16import AST.PrettyPrint
16import AST.PrettyPrint
17+import Elm.Utils ((|>))
17import Text.PrettyPrint as P
18import Text.PrettyPrint as P
18
19
19
20
20mistakes :: [D.ValidDecl] -> [Doc]
21mistakes :: [D.ValidDecl] -> [Doc]
21mistakes decls =
22mistakes decls =
23+ concat
22− concat [ infiniteTypeAliases decls
24+ [ infiniteTypeAliases decls
23− , illFormedTypes decls
25+ , illFormedTypes decls
24− , map P.text (duplicateConstructors decls)
26+ , map P.text (duplicateTypeDeclarations decls)
25− , map P.text (duplicates decls) ]
27+ , map P.text (duplicateValues decls)
28+ ]
29+
26
30
27dups :: Ord a => [a] -> [a]
31dups :: Ord a => [a] -> [a]
32+dups names =
33+ List.sort names
34+ |> List.group
28−dups = map head . filter ((>1) . length) . List.group . List.sort
35+ |> filter ((>1) . length)
36+ |> map head
29
37
30−dupErr :: String -> String -> String
31−dupErr err x =
32− "Syntax Error: There can only be one " ++ err ++ " '" ++ x ++ "'."
33
38
34−duplicates :: [D.ValidDecl] -> [String]
39+duplicateValues :: [D.ValidDecl] -> [String]
35−duplicates decls =
40+duplicateValues decls =
36 map msg (dups (portNames ++ concatMap Pattern.boundVarList defPatterns)) ++
41 map msg (dups (portNames ++ concatMap Pattern.boundVarList defPatterns)) ++
37 case mapM exprDups (portExprs ++ defExprs) of
42 case mapM exprDups (portExprs ++ defExprs) of
38 Left name -> [msg name]
43 Left name -> [msg name]
39 Right _ -> []
44 Right _ -> []
40
45
41 where
46 where
42− msg = dupErr "definition of"
47+ msg x =
48+ "Naming Error: There can only be one definition of '" ++ x ++ "'."
43
49
44 (defPatterns, defExprs) =
50 (defPatterns, defExprs) =
45 unzip [ (pat,expr) | D.Definition (Valid.Definition pat expr _) <- decls ]
51 unzip [ (pat,expr) | D.Definition (Valid.Definition pat expr _) <- decls ]
@@ -61,13 +67,31 @@ duplicates decls =
61 [] -> Right defs
67 [] -> Right defs
62 name:_ -> Left name
68 name:_ -> Left name
63
69
70+
64−duplicateConstructors :: [D.ValidDecl] -> [String]
71+duplicateTypeDeclarations :: [D.ValidDecl] -> [String]
65−duplicateConstructors decls =
72+duplicateTypeDeclarations decls =
66− map (dupErr "definition of type constructor") (dups typeCtors) ++
73+ map dupTypeError (dups (typeNames ++ aliasNames))
67− map (dupErr "definition of data constructor") (dups dataCtors)
74+ ++ map dupCtorError (dups (ctorNames ++ aliasNames))
68 where
75 where
76+ typeNames =
69− typeCtors = [ name | D.Datatype name _ _ <- decls ]
77+ [ name | D.Datatype name _ _ <- decls ]
78+
79+ aliasNames =
80+ [ name | D.TypeAlias name _ _ <- decls ]
81+
82+ ctorNames =
70− dataCtors = concat [ map fst patterns | D.Datatype _ _ patterns <- decls ]
83+ concat [ map fst patterns | D.Datatype _ _ patterns <- decls ]
84+
85+
86+dupTypeError :: String -> String
87+dupTypeError name =
88+ "Naming Error: There can only be one type named '" ++ name ++ "'"
89+
90+
91+dupCtorError :: String -> String
92+dupCtorError name =
93+ "Naming Error: There can only be one type or record constructor named '" ++ name ++ "'"
94+
71
95
72illFormedTypes :: [D.ValidDecl] -> [Doc]
96illFormedTypes :: [D.ValidDecl] -> [Doc]
73illFormedTypes decls = map report (Maybe.mapMaybe isIllFormed (aliases ++ adts))
97illFormedTypes decls = map report (Maybe.mapMaybe isIllFormed (aliases ++ adts))