@@ -30,10 +30,11 @@ import qualified Transform.SortDefinitions as Transform
3030import qualified Transform.Declaration as Transform
3131
3232environment :: Interfaces -> Module.ValidModule -> Either [Doc] Environment
33−environment interfaces (Module.Module _ _ _ ims decls) =
33+environment interfaces m@(Module.Module _ _ _ ims decls) =
3434 do () <- allImportsAvailable interfaces ims
3535 nonLocalEnv <- foldM (toEnv interfaces) Env.builtIns ims
36− foldM addDecl nonLocalEnv decls
36+ let moduleName = Module.getName m
37+ foldM (addDecl moduleName) nonLocalEnv decls
3738
3839toEnv :: Interfaces -> Environment -> (String, ImportMethod) -> Either [Doc] Environment
3940toEnv interfaces environ (name,method)
@@ -72,9 +73,9 @@ addValue :: String -> Module.Interface -> Environment -> Var.Value
7273 -> Either [Doc] Environment
7374addValue name interface env value =
7475 let insert' x = insert x (Var.Canonical (Var.Module name) x)
75− notFound x = Left [ P.text $
76− "Import Error: Could not import value '" ++ name ++ "." ++ x ++ "'.\n" ++
77− " It is not exported by module " ++ name ++ "." ]
76+ msg x = "Import Error: Could not import value '" ++ name ++ "." ++ x ++
77+ "'.\n It is not exported by module " ++ name ++ "."
78+ notFound x = Left [ P.text (msg x) ]
7879 in
7980 case value of
8081 Var.Value x
@@ -106,8 +107,9 @@ addValue name interface env value =
106107 [] -> return names
107108 c:_ -> notFound c
108109
109−addDecl :: Environment -> D.ValidDecl -> Either [Doc] Environment
110−addDecl env decl =
110+addDecl :: String -> Environment -> D.ValidDecl -> Either [Doc] Environment
111+addDecl moduleName env decl =
112+ let typeVar = Var.Canonical (Var.Module moduleName) in
111113 case decl of
112114 D.Definition (Valid.Definition pattern _ _) ->
113115 return $ env
@@ -118,19 +120,19 @@ addDecl env decl =
118120 D.Datatype name _ ctors ->
119121 return $ env
120122 { _values = addCtors (_values env)
121− , _adts = insert name (Var.local name) (_adts env)
123+ , _adts = insert name (typeVar name) (_adts env)
122124 , _patterns = addCtors (_patterns env)
123125 }
124126 where
125127 addCtors e = foldr add e (map fst ctors)
126− add name e = insert name (Var.local name) e
128+ add name e = insert name (typeVar name) e
127129
128130 D.TypeAlias name tvars alias ->
129131 do alias' <- Either.either throw return (tipe env alias)
130132 return $ env
131− { _aliases = insert name (Var.local name, tvars, alias') (_aliases env)
133+ { _aliases = insert name (typeVar name, tvars, alias') (_aliases env)
132134 , _values = case alias of
133− Type.Record _ _ -> insert name (Var.local name) (_values env)
135+ Type.Record _ _ -> insert name (typeVar name) (_values env)
134136 _ -> _values env
135137 }
136138 where
@@ -158,7 +160,7 @@ module' interfaces modul@(Module.Module _ _ exs _ decls) =
158160 body :: [D.CanonicalDecl] -> CanonicalBody
159161 body decls =
160162 CanonicalBody
161− { program = Transform.sortDefs . dummyLet $ Transform.toExpr decls
163+ { program = Transform.sortDefs . dummyLet $ Transform.toExpr (Module.getName modul) decls
162164 , types = Map.empty
163165 , datatypes = Map.fromList [ (name,(vars,ctors)) | Datatype name vars ctors <- decls ]
164166 , fixities = [ (assoc,level,op) | Fixity assoc level op <- decls ]
@@ -198,6 +200,23 @@ delist fullList (Var.Listing partial open)
198200
199201 _ -> go list xs partial
200202
203+filterExports :: Module.Types -> [Var.Value] -> Module.Types
204+filterExports types values =
205+ Map.fromList (concatMap getValue values)
206+ where
207+ getValue :: Var.Value -> [(String, Type.CanonicalType)]
208+ getValue value =
209+ case value of
210+ Var.Value x -> get x
211+ Var.Alias x -> get x
212+ Var.ADT _ (Var.Listing ctors _) -> concatMap get ctors
213+
214+ get :: String -> [(String, Type.CanonicalType)]
215+ get x =
216+ case Map.lookup x types of
217+ Just t -> [(x,t)]
218+ Nothing -> []
219+
201220declToValue :: D.ValidDecl -> [Var.Value]
202221declToValue decl =
203222 case decl of