@@ -30,11 +30,18 @@ import qualified Transform.Interface as Interface
31environment :: Module.Interfaces -> Module.ValidModule -> Canonicalizer [Doc] Environment
31environment :: Module.Interfaces -> Module.ValidModule -> Canonicalizer [Doc] Environment
32environment interfaces modul@(Module.Module _ _ _ imports decls) =
32environment interfaces modul@(Module.Module _ _ _ imports decls) =
33− do () <- allImportsAvailable
33+ do () <- allImportsAvailable
34− let moduleName = Module.names modul
35+ Module.names modul
35− nonLocalEnv <- foldM (addImports moduleName interfaces) (builtIns moduleName) imports
38+ foldM (addImports moduleName interfaces) (builtIns moduleName) imports
36− let (aliases, env) = List.foldl' (addDecl moduleName) ([], nonLocalEnv) decls
41+ List.foldl' (addDecl moduleName) ([], nonLocalEnv) decls
37− addTypeAliases moduleName aliases env
43+ addTypeAliases moduleName aliases env
39 allImportsAvailable :: Canonicalizer [Doc] ()
46 allImportsAvailable :: Canonicalizer [Doc] ()
40 allImportsAvailable =
47 allImportsAvailable =
@@ -42,53 +49,80 @@ environment interfaces modul@(Module.Module _ _ _ imports decls) =
42 [] -> return ()
49 [] -> return ()
43 missings -> throwError [ P.text (missingModuleError missings) ]
50 missings -> throwError [ P.text (missingModuleError missings) ]
45− modules = map fst imports
53+ map fst imports
47− found m = Map.member m interfaces || Module.nameIsNative m
56+ Map.member m interfaces || Module.nameIsNative m
49 missingModuleError missings =
58 missingModuleError missings =
50− concat [ "The following imports were not found:\n "
60+ [ "The following imports were not found:\n "
51− , List.intercalate ", " (map Module.nameToString missings)
61+ , List.intercalate ", " (map Module.nameToString missings)
55−addImports :: Module.Name -> Module.Interfaces -> Environment -> (Module.Name, Module.ImportMethod)
69+ -> (Module.Name, Module.ImportMethod)
56− -> Canonicalizer [Doc] Environment
70+ -> Canonicalizer [Doc] Environment
57addImports moduleName interfaces environ (name, method)
71addImports moduleName interfaces environ (name, method)
58− | Module.nameIsNative name = return environ
72+ | Module.nameIsNative name =
59 | otherwise =
75 | otherwise =
60− case method of
76+ let (Module.ImportMethod maybeAlias listing) = method
62− return (updateEnviron (name' ++ "."))
64− Module.Open (Var.Listing vs open)
78+ (Var.Listing exposedVars open) = listing
81+ maybe (Module.nameToString name) id maybeAlias
84+ updateEnviron (qualifier ++ ".") environ
65− | open -> return (updateEnviron "")
87+ then return (updateEnviron "" env)
66− | otherwise -> foldM (addValue name interface) environ vs
88+ else foldM (addValue name interface) env exposedVars
68− interface = Interface.filterExports ((Map.!) interfaces name)
91+ Interface.filterExports ((Map.!) interfaces name)
70− updateEnviron prefix =
93+ updateEnviron prefix env =
71− let dict' = dict . map (first (prefix++)) in
94+ let dict' = dict . map (first (prefix++)) in
72− merge environ $
95+ merge env $
73− Env { _home = moduleName
96+ Env { _home = moduleName
74− , _values = dict' $ map pair (Map.keys (iTypes interface)) ++ ctors
97+ , _values = dict' $ map pair (Map.keys (iTypes interface)) ++ ctors
75− , _adts = dict' $ map pair (Map.keys (iAdts interface))
98+ , _adts = dict' $ map pair (Map.keys (iAdts interface))
76− , _aliases = dict' $ map alias (Map.toList (iAliases interface))
99+ , _aliases = dict' $ map alias (Map.toList (iAliases interface))
77− , _patterns = dict' $ ctors
100+ , _patterns = dict' $ ctors
80− canonical :: String -> Var.Canonical
103+ canonical :: String -> Var.Canonical
81− canonical = Var.Canonical (Var.Module name)
105+ Var.Canonical (Var.Module name)
83− pair :: String -> (String, Var.Canonical)
107+ pair :: String -> (String, Var.Canonical)
84− pair key = (key, canonical key)
109+ (key, canonical key)
111+ alias (x,(tvars,tipe)) =
86− alias (x,(tvars,tipe)) = (x, (canonical x, tvars, tipe))
112+ (x, (canonical x, tvars, tipe))
116+ (map (pair . fst) . snd . snd)
88− ctors = concatMap (map (pair . fst) . snd . snd) (Map.toList (iAdts interface))
117+ (Map.toList (iAdts interface))
90−addValue :: Module.Name -> Module.Interface -> Environment -> Var.Value
122+ -> Module.Interface
91− -> Canonicalizer [Doc] Environment
125+ -> Canonicalizer [Doc] Environment
92addValue moduleName interface env value =
126addValue moduleName interface env value =
93 let name = Module.nameToString moduleName
127 let name = Module.nameToString moduleName
94 insert' x = insert x (Var.Canonical (Var.Module moduleName) x)
128 insert' x = insert x (Var.Canonical (Var.Module moduleName) x)
@@ -98,7 +132,9 @@ addValue moduleName interface env value =
99 case value of
133 case value of
100 Var.Value x
134 Var.Value x
101− | Map.notMember x (iTypes interface) -> notFound x
135+ | Map.notMember x (iTypes interface) ->
102 | otherwise ->
138 | otherwise ->
103 return $ env { _values = insert' x (_values env) }
139 return $ env { _values = insert' x (_values env) }
@@ -126,11 +162,12 @@ addValue moduleName interface env value =
126 case Map.lookup x (iAdts interface) of
162 case Map.lookup x (iAdts interface) of
127 Nothing -> notFound x
163 Nothing -> notFound x
128 Just (_tvars, ctors) ->
164 Just (_tvars, ctors) ->
129− do ctors' <- filterNames (map fst ctors)
165+ do ctors' <- filterNames (map fst ctors)
130− return $ env { _adts = insert' x (_adts env)
167+ { _adts = insert' x (_adts env)
131− , _values = foldr insert' (_values env) ctors'
168+ , _values = foldr insert' (_values env) ctors'
132− , _patterns = foldr insert' (_patterns env) ctors'
169+ , _patterns = foldr insert' (_patterns env) ctors'
135 filterNames names
172 filterNames names
136 | open = return names
173 | open = return names
@@ -139,19 +176,22 @@ addValue moduleName interface env value =
139 [] -> return names
176 [] -> return names
140 c:_ -> notFound c
177 c:_ -> notFound c
142type Node = ((String, [String], Type.RawType), String, [String])
180type Node = ((String, [String], Type.RawType), String, [String])
144node :: String -> [String] -> Type.RawType -> Node
183node :: String -> [String] -> Type.RawType -> Node
184+node name tvars alias =
145−node name tvars alias = ((name, tvars, alias), name, edges alias)
185+ ((name, tvars, alias), name, edges alias)
147− edges tipe =
187+ edges tipe =
148− case tipe of
188+ case tipe of
149− Type.Lambda t1 t2 -> edges t1 ++ edges t2
189+ Type.Lambda t1 t2 -> edges t1 ++ edges t2
150− Type.Var _ -> []
190+ Type.Var _ -> []
151− Type.Type (Var.Raw x) -> [x]
191+ Type.Type (Var.Raw x) -> [x]
152− Type.App t ts -> edges t ++ concatMap edges ts
192+ Type.App t ts -> edges t ++ concatMap edges ts
153− Type.Record fs ext -> maybe [] edges ext ++ concatMap (edges . snd) fs
193+ Type.Record fs ext -> maybe [] edges ext ++ concatMap (edges . snd) fs
154− Type.Aliased _ t -> edges t
194+ Type.Aliased _ t -> edges t
157addTypeAliases
197addTypeAliases
@@ -232,7 +272,11 @@ typeAliasErrorExplanation =
232-- When canonicalizing, all _values should be Local, but all _adts and _patterns
272-- When canonicalizing, all _values should be Local, but all _adts and _patterns
233-- should be fully namespaced. With _adts, they may appear in types that can
273-- should be fully namespaced. With _adts, they may appear in types that can
234-- escape the module.
274-- escape the module.
235−addDecl :: Module.Name -> ([Node], Environment) -> D.ValidDecl -> ([Node], Environment)
277+ -> ([Node], Environment)
279+ -> ([Node], Environment)
236addDecl moduleName info@(nodes,env) decl =
280addDecl moduleName info@(nodes,env) decl =
237 let namespacedVar = Var.Canonical (Var.Module moduleName)
281 let namespacedVar = Var.Canonical (Var.Module moduleName)
238 addLocal x e = insert x (Var.local x) e
282 addLocal x e = insert x (Var.local x) e
@@ -241,29 +285,41 @@ addDecl moduleName info@(nodes,env) decl =
241 case decl of
285 case decl of
242 D.Definition (Valid.Definition pattern _ _) ->
286 D.Definition (Valid.Definition pattern _ _) ->
243 (,) nodes $ env
287 (,) nodes $ env
244− { _values = foldr addLocal (_values env) (P.boundVarList pattern) }
289+ foldr addLocal (_values env) (P.boundVarList pattern)
246 D.Datatype name _ ctors ->
292 D.Datatype name _ ctors ->
247 (,) nodes $ env
293 (,) nodes $ env
248− { _values = addCtors addLocal (_values env)
295+ addCtors addLocal (_values env)
249− , _adts = addNamespaced name (_adts env)
297+ addNamespaced name (_adts env)
250− , _patterns = addCtors addNamespaced (_patterns env)
299+ addCtors addNamespaced (_patterns env)
253 addCtors how e = foldr how e (map fst ctors)
302 addCtors how e = foldr how e (map fst ctors)
255 D.TypeAlias name tvars alias ->
304 D.TypeAlias name tvars alias ->
256 (,) (node name tvars alias : nodes) $ env
305 (,) (node name tvars alias : nodes) $ env
257− { _values = case alias of
307+ case alias of
258− Type.Record _ _ -> addLocal name (_values env)
309+ addLocal name (_values env)
259− _ -> _values env
311+ _values env
262 D.Port port ->
314 D.Port port ->
263− let portName = case port of
315+ let portName =
264− D.Out name _ _ -> name
317+ D.Out name _ _ -> name
265− D.In name _ -> name
318+ D.In name _ -> name
267− (,) nodes $ env { _values = addLocal portName (_values env) }
322+ addLocal portName (_values env)
269 D.Fixity _ _ _ -> info
325 D.Fixity _ _ _ -> info