@@ -10,6 +10,7 @@ module Canonicalize.Environment.Foreign
10import Control.Monad (foldM)
10import Control.Monad (foldM)
11import qualified Data.List as List
11import qualified Data.List as List
12import qualified Data.Map.Strict as Map
12import qualified Data.Map.Strict as Map
13+import Data.Map.Strict ((!))
13import qualified Data.Name as Name
14import qualified Data.Name as Name
15import qualified AST.Canonical as Can
16import qualified AST.Canonical as Can
@@ -30,26 +31,12 @@ type Result i w a =
30 Result.Result i w Error.Error a
31 Result.Result i w Error.Error a
38− Map.Map Name.Name ModuleName.Canonical
41−createInitialEnv :: ModuleName.Canonical -> ImportDict -> I.Interfaces -> [Src.Import] -> Result i w Env.Env
34+createInitialEnv :: ModuleName.Canonical -> Map.Map ModuleName.Raw I.Interface -> [Src.Import] -> Result i w Env.Env
42−createInitialEnv home importDict interfaces sourceImports =
35+createInitialEnv home ifaces imports =
43− do imports <- traverse (verifyImport importDict interfaces) (filter isNotKernel sourceImports)
44− (State vs ts cs bs qvs qts qcs) <- foldM addImport emptyState imports
36+ do (State vs ts cs bs qvs qts qcs) <- foldM (addImport ifaces) emptyState imports
45 Result.ok (Env.Env home (Map.map Env.Foreign vs) ts cs bs qvs qts qcs)
37 Result.ok (Env.Env home (Map.map Env.Foreign vs) ts cs bs qvs qts qcs)
48−isNotKernel :: Src.Import -> Bool
49−isNotKernel (Src.Import (A.At _ name) _ _) =
50− not (Name.isKernel name)
@@ -80,9 +67,13 @@ emptyTypes =
80-- ADD IMPORTS
67-- ADD IMPORTS
83−addImport :: State -> Import -> Result i w State
70+addImport :: Map.Map ModuleName.Raw I.Interface -> State -> Src.Import -> Result i w State
84−addImport (State vs ts cs bs qvs qts qcs) (Import home (I.Interface defs unions aliases binops) prefix exposing) =
71+addImport ifaces (State vs ts cs bs qvs qts qcs) (Src.Import (A.At _ name) maybeAlias exposing) =
73+ (I.Interface pkg defs unions aliases binops) = ifaces ! name
74+ !prefix = maybe name id maybeAlias
75+ !home = ModuleName.Canonical pkg name
86 !rawTypeInfo =
77 !rawTypeInfo =
88 (Map.mapMaybeWithKey (unionToType home) unions)
79 (Map.mapMaybeWithKey (unionToType home) unions)
@@ -276,31 +267,3 @@ toCtors types =
287− { _name :: ModuleName.Canonical
288− , _interface :: I.Interface
289− , _prefix :: Name.Name
290− , _exposing :: Src.Exposing
294−verifyImport :: ImportDict -> I.Interfaces -> Src.Import -> Result i w Import
295−verifyImport importDict interfaces (Src.Import (A.At region name) alias exposing) =
296− case Map.lookup name importDict of
297− Just canonicalName ->
298− case Map.lookup canonicalName interfaces of
300− Result.ok (Import canonicalName interface (maybe name id alias) exposing)
303− Result.throw $ Error.ImportNotFound region name (Map.keys interfaces)
306− Result.throw $ Error.ImportNotFound region name (Map.elems importDict)