@@ -9,6 +9,7 @@ import qualified Data.Set as Set
9import Types.Substitutions (subst)
9import Types.Substitutions (subst)
10import Types.Types
10import Types.Types
11import Data.Data
11import Data.Data
12+import Data.Generics.Uniplate.Data
13builtins :: [(String,([X],Type))]
14builtins :: [(String,([X],Type))]
@@ -28,13 +29,16 @@ builtins =
28 ("LineStyle", ([], makeRecord line))
29 ("LineStyle", ([], makeRecord line))
31−get :: [Declaration t v] -> Map.Map String ([X],Type)
32+type AliasDict = Map.Map String ([X],Type)
32−get stmts = Map.fromList (builtins ++ concatMap getAlias stmts)
33− where getAlias stmt = case stmt of
34− TypeAlias alias xs t -> [(alias, (xs,t))]
34+get :: [Declaration t v] -> AliasDict
35+get decl = Map.fromList (builtins ++ concatMap getAlias decl)
37+ getAlias decl = case decl of
38+ TypeAlias alias xs t -> [(alias, (xs,t))]
37−dealias :: Map.Map String ([X],Type) -> Type -> Type
41+dealias :: AliasDict -> Type -> Type
38dealias aliases t =
42dealias aliases t =
39 let f = dealias aliases in
43 let f = dealias aliases in
@@ -45,38 +49,54 @@ dealias aliases t =
45 RecordT r t -> RecordT (Map.map (map f) r) (f t)
49 RecordT r t -> RecordT (Map.map (map f) r) (f t)
48−mistakes :: [Declaration t v] -> [String]
52+--mistakes :: [Def t v] -> [String]
49−mistakes stmts = badKinds stmts ++ dups stmts ++ badOrder stmts
53+mistakes defs = badKinds defs -- ++ dups defs ++ badOrder defs
55+extractDefs :: [Declaration t v] -> [Def t v]
56+extractDefs = concatMap keepDef
58+ keepDef decl = case decl of
59+ Definition def -> [def]
51−badKinds :: [Declaration t v] -> [String]
62+badKinds :: (Data t, Data v) => [Declaration t v] -> [String]
52−badKinds stmts = map msg (concatMap badS stmts)
63+badKinds decls = map msg (concatMap bad decls)
54 msg x = "Type Error: Type alias '" ++ x ++
65 msg x = "Type Error: Type alias '" ++ x ++
55 "' was given the wrong number of arguments."
66 "' was given the wrong number of arguments."
57− badT :: Type -> [String]
71+ badType :: Type -> [String]
58− badT t =
72+ badType t =
59− case t of
73+ case t of
60− ADT name ts ->
74+ ADT name ts ->
61− case Map.lookup name (get stmts) of
75+ case Map.lookup name aliases of
62− Just (xs,t) | length xs == length ts -> []
76+ Just (xs,t) | length xs == length ts -> []
63− | otherwise -> [name]
77+ | otherwise -> [name]
64− Nothing -> concatMap badT ts
78+ Nothing -> concatMap badType ts
65− LambdaT t u -> badT t ++ badT u
79+ LambdaT t u -> badType t ++ badType u
66− RecordT r t -> badT t ++ concatMap badT (concat (Map.elems r))
80+ RecordT r t -> badType t ++ concatMap badType (concat (Map.elems r))
83+ --badDef :: AliasDict -> Def t v -> [String]
86+ TypeAnnotation _ tipe -> badType tipe
88+ concatMap badDef $ concat [defList | Let defList _ <- universeBi expr]
90+ concatMap badDef $ concat [defList | Let defList _ <- universeBi expr]
69− badS :: Declaration t v -> [String]
92+ --bad :: Declaration t v -> [String]
72− Datatype _ _ tcs -> concatMap badT (concatMap snd tcs)
95+ Datatype _ _ tcs -> concatMap badType (concatMap snd tcs)
73− ExportEvent _ _ tipe -> badT tipe
96+ ExportEvent _ _ tipe -> badType tipe
74− ImportEvent _ _ _ tipe -> badT tipe
97+ ImportEvent _ _ _ tipe -> badType tipe
75− TypeAlias _ _ tipe -> badT tipe
98+ TypeAlias _ _ tipe -> badType tipe
76− Definition d ->
99+ Definition d -> badDef d
78− TypeAnnotation _ tipe -> badT tipe
81annotation :: Declaration t v -> [String]
101annotation :: Declaration t v -> [String]
82annotation s =
102annotation s =
@@ -97,22 +117,22 @@ defName d =
97 OpDef n _ _ _ -> n
117 OpDef n _ _ _ -> n
99dups :: [Declaration t v] -> [String]
119dups :: [Declaration t v] -> [String]
100−dups stmts = map defMsg (dup definition) ++ map annMsg (dup annotation)
120+dups defs = map defMsg (dup definition) ++ map annMsg (dup annotation)
102 --dup :: (Declaration t v -> [String]) -> [String]
122 --dup :: (Declaration t v -> [String]) -> [String]
103− dup f = map head . filter ((>1) . length) . group . sort $ concatMap f stmts
123+ dup f = map head . filter ((>1) . length) . group . sort $ concatMap f defs
105 msg = "Syntax Error: There can only be one "
125 msg = "Syntax Error: There can only be one "
106 defMsg x = msg ++ "top-level definition of '" ++ x ++ "'."
126 defMsg x = msg ++ "top-level definition of '" ++ x ++ "'."
107 annMsg x = msg ++ "type annotation for '" ++ x ++ "'."
127 annMsg x = msg ++ "type annotation for '" ++ x ++ "'."
109−badOrder :: [Declaration t v] -> [String]
129+--badOrder :: [Def t v] -> [String]
110−badOrder stmts = map msg $ missings (sort $ expectedPairs as ds) (sort $ actualPairs stmts)
130+badOrder defs = map msg $ missings (sort $ expectedPairs as ds) (sort $ actualPairs defs)
112 msg x = "Syntax Error: The type annotation for '" ++ x ++
132 msg x = "Syntax Error: The type annotation for '" ++ x ++
113 "' must be directly above its definition."
133 "' must be directly above its definition."
114− as = sort $ concatMap annotation stmts
134+ as = sort $ concatMap annotation defs
115− ds = sort $ concatMap definition stmts
135+ ds = sort $ concatMap definition defs
117 expectedPairs :: [String] -> [String] -> [String]
137 expectedPairs :: [String] -> [String] -> [String]
118 expectedPairs as ds =
138 expectedPairs as ds =
@@ -123,9 +143,9 @@ badOrder stmts = map msg $ missings (sort $ expectedPairs as ds) (sort $ actualP
123 GT -> expectedPairs (x:xs) ys
143 GT -> expectedPairs (x:xs) ys
124 ( _ , _ ) -> []
144 ( _ , _ ) -> []
126− --actualPairs :: [Declaration t v] -> [String]
146+ --actualPairs :: [Def t v] -> [String]
127− actualPairs stmts =
147+ actualPairs defs =
128− case stmts of
148+ case defs of
129 Definition (TypeAnnotation n _) : Definition d : rest ->
149 Definition (TypeAnnotation n _) : Definition d : rest ->
130 (if n == defName d then [n] else []) ++ actualPairs rest
150 (if n == defName d then [n] else []) ++ actualPairs rest
131 t:s:rest -> actualPairs (s:rest)
151 t:s:rest -> actualPairs (s:rest)