on master help sign in
fix #624 and #799, better error messages and style
commitdb31fe20d45d6340ee2efc1beda81d9a8fe6606d authorEvan Czaplicki <info@elm-lang.org> dateMon 17 Nov 2014, 12:13 (12 years ago) parente7b401a
1 file changed+41−17
src/Transform/Check.hs+41−17
src/Transform/Check.hs+41−17
@@ -14,32 +14,38 @@ import qualified AST.Variable as Var
1414import qualified Transform.Expression as Expr
1515
1616import AST.PrettyPrint
17+import Elm.Utils ((|>))
1718import Text.PrettyPrint as P
1819
1920
2021mistakes :: [D.ValidDecl] -> [Doc]
2122mistakes decls =
22− concat [ infiniteTypeAliases decls
23− , illFormedTypes decls
24− , map P.text (duplicateConstructors decls)
25− , map P.text (duplicates decls) ]
23+ concat
24+ [ infiniteTypeAliases decls
25+ , illFormedTypes decls
26+ , map P.text (duplicateTypeDeclarations decls)
27+ , map P.text (duplicateValues decls)
28+ ]
29+
2630
2731dups :: Ord a => [a] -> [a]
28−dups = map head . filter ((>1) . length) . List.group . List.sort
32+dups names =
33+ List.sort names
34+ |> List.group
35+ |> filter ((>1) . length)
36+ |> map head
2937
30−dupErr :: String -> String -> String
31−dupErr err x =
32− "Syntax Error: There can only be one " ++ err ++ " '" ++ x ++ "'."
3338
34−duplicates :: [D.ValidDecl] -> [String]
35−duplicates decls =
39+duplicateValues :: [D.ValidDecl] -> [String]
40+duplicateValues decls =
3641 map msg (dups (portNames ++ concatMap Pattern.boundVarList defPatterns)) ++
3742 case mapM exprDups (portExprs ++ defExprs) of
3843 Left name -> [msg name]
3944 Right _ -> []
4045
4146 where
42− msg = dupErr "definition of"
47+ msg x =
48+ "Naming Error: There can only be one definition of '" ++ x ++ "'."
4349
4450 (defPatterns, defExprs) =
4551 unzip [ (pat,expr) | D.Definition (Valid.Definition pat expr _) <- decls ]
@@ -61,13 +67,31 @@ duplicates decls =
6167 [] -> Right defs
6268 name:_ -> Left name
6369
64−duplicateConstructors :: [D.ValidDecl] -> [String]
65−duplicateConstructors decls =
66− map (dupErr "definition of type constructor") (dups typeCtors) ++
67− map (dupErr "definition of data constructor") (dups dataCtors)
70+
71+duplicateTypeDeclarations :: [D.ValidDecl] -> [String]
72+duplicateTypeDeclarations decls =
73+ map dupTypeError (dups (typeNames ++ aliasNames))
74+ ++ map dupCtorError (dups (ctorNames ++ aliasNames))
6875 where
69− typeCtors = [ name | D.Datatype name _ _ <- decls ]
70− dataCtors = concat [ map fst patterns | D.Datatype _ _ patterns <- decls ]
76+ typeNames =
77+ [ name | D.Datatype name _ _ <- decls ]
78+
79+ aliasNames =
80+ [ name | D.TypeAlias name _ _ <- decls ]
81+
82+ ctorNames =
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+
7195
7296illFormedTypes :: [D.ValidDecl] -> [Doc]
7397illFormedTypes decls = map report (Maybe.mapMaybe isIllFormed (aliases ++ adts))