@@ -62,7 +62,7 @@ desugarImports modules = do
62 renameInModule' env m@(Module _ _ mn _ _) =
62 renameInModule' env m@(Module _ _ mn _ _) =
63 rethrow (onErrorMessages (ErrorInModule mn)) $ do
63 rethrow (onErrorMessages (ErrorInModule mn)) $ do
64 let (_, imps, exps) = fromMaybe (error "Module is missing in renameInModule'") $ M.lookup mn env
64 let (_, imps, exps) = fromMaybe (error "Module is missing in renameInModule'") $ M.lookup mn env
65− elaborateImports <$> renameInModule env imps (elaborateExports exps m)
65+ elaborateImports imps <$> renameInModule env imps (elaborateExports exps m)
68-- Make all exports for a module explicit. This may still effect modules that
68-- Make all exports for a module explicit. This may still effect modules that
@@ -70,11 +70,12 @@ desugarImports modules = do
70-- explicit.
70-- explicit.
72elaborateExports :: Exports -> Module -> Module
72elaborateExports :: Exports -> Module -> Module
73−elaborateExports exps (Module ss coms mn decls _) =
73+elaborateExports exps (Module ss coms mn decls refs) =
74 Module ss coms mn decls $
74 Module ss coms mn decls $
75 Just $ map (\(ctor, dctors) -> TypeRef ctor (Just dctors)) (my exportedTypes) ++
75 Just $ map (\(ctor, dctors) -> TypeRef ctor (Just dctors)) (my exportedTypes) ++
76 map TypeClassRef (my exportedTypeClasses) ++
76 map TypeClassRef (my exportedTypeClasses) ++
77− map ValueRef (my exportedValues)
77+ map ValueRef (my exportedValues) ++
78+ maybe [] (filter isModuleRef) refs
79 -- Extracts a list of values from the exports and filters out any values that
80 -- Extracts a list of values from the exports and filters out any values that
80 -- are re-exports from other modules.
81 -- are re-exports from other modules.
@@ -85,15 +86,15 @@ elaborateExports exps (Module ss coms mn decls _) =
85-- Add `import X ()` for any modules where there are only fully qualified references to members.
86-- Add `import X ()` for any modules where there are only fully qualified references to members.
86-- This ensures transitive instances are included when using a member from a module.
87-- This ensures transitive instances are included when using a member from a module.
88−elaborateImports :: Module -> Module
89+elaborateImports :: Imports -> Module -> Module
89−elaborateImports (Module ss coms mn decls exps) = Module ss coms mn decls' exps
90+elaborateImports imps (Module ss coms mn decls exps) = Module ss coms mn decls' exps
91 decls' :: [Declaration]
92 decls' :: [Declaration]
93 let (f, _, _, _, _) = everythingOnValues (++) (const []) fqValues (const []) (const []) (const [])
94 let (f, _, _, _, _) = everythingOnValues (++) (const []) fqValues (const []) (const []) (const [])
94 in mkImport `map` nub (f `concatMap` decls) ++ decls
95 in mkImport `map` nub (f `concatMap` decls) ++ decls
95 fqValues :: Expr -> [ModuleName]
96 fqValues :: Expr -> [ModuleName]
96− fqValues (Var (Qualified (Just mn') _)) = [mn']
97+ fqValues (Var (Qualified (Just mn') _)) | notElem mn' (importedModules imps) = [mn']
97 fqValues _ = []
98 fqValues _ = []
98 mkImport :: ModuleName -> Declaration
99 mkImport :: ModuleName -> Declaration
99 mkImport mn' = ImportDeclaration mn' (Explicit []) Nothing
100 mkImport mn' = ImportDeclaration mn' (Explicit []) Nothing