@@ -14,32 +14,38 @@ import qualified AST.Variable as Var
14import qualified Transform.Expression as Expr
14import qualified Transform.Expression as Expr
16import AST.PrettyPrint
16import AST.PrettyPrint
17+import Elm.Utils ((|>))
17import Text.PrettyPrint as P
18import Text.PrettyPrint as P
20mistakes :: [D.ValidDecl] -> [Doc]
21mistakes :: [D.ValidDecl] -> [Doc]
21mistakes decls =
22mistakes decls =
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)
27dups :: Ord a => [a] -> [a]
31dups :: Ord a => [a] -> [a]
28−dups = map head . filter ((>1) . length) . List.group . List.sort
35+ |> filter ((>1) . length)
30−dupErr :: String -> String -> String
32− "Syntax Error: There can only be one " ++ err ++ " '" ++ x ++ "'."
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 _ -> []
42− msg = dupErr "definition of"
47+ msg x =
48+ "Naming Error: There can only be one definition of '" ++ x ++ "'."
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
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))
69− typeCtors = [ name | D.Datatype name _ _ <- decls ]
77+ [ name | D.Datatype name _ _ <- decls ]
80+ [ name | D.TypeAlias name _ _ <- decls ]
70− dataCtors = concat [ map fst patterns | D.Datatype _ _ patterns <- decls ]
83+ concat [ map fst patterns | D.Datatype _ _ patterns <- decls ]
86+dupTypeError :: String -> String
88+ "Naming Error: There can only be one type named '" ++ name ++ "'"
91+dupCtorError :: String -> String
93+ "Naming Error: There can only be one type or record constructor named '" ++ name ++ "'"
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))