@@ -4,7 +4,7 @@
4-- Copyright : (c) 2013-14 Phil Freeman, (c) 2014 Gary Burgess, and other contributors
4-- Copyright : (c) 2013-14 Phil Freeman, (c) 2014 Gary Burgess, and other contributors
5-- License : MIT
5-- License : MIT
7−-- Maintainer : Phil Freeman <paf31@cantab.net>
7+-- Maintainer : Phil Freeman <paf31@cantab.net>, Gary Burgess <gary.burgess@gmail.com>
8-- Stability : experimental
8-- Stability : experimental
9-- Portability :
9-- Portability :
@@ -16,6 +16,7 @@ module Language.PureScript.Sugar.Names (
16 desugarImports
16 desugarImports
19+import Data.List (nub)
19import Data.Maybe (fromMaybe, isJust, mapMaybe)
20import Data.Maybe (fromMaybe, isJust, mapMaybe)
20import Data.Monoid ((<>))
21import Data.Monoid ((<>))
@@ -158,7 +159,7 @@ desugarImports modules = do
158 let env = M.update (\_ -> M.lookup mn unfilteredExports) mn exports
159 let env = M.update (\_ -> M.lookup mn unfilteredExports) mn exports
159 let exps = fromMaybe (error "Module is missing in renameInModule'") $ M.lookup mn exports
160 let exps = fromMaybe (error "Module is missing in renameInModule'") $ M.lookup mn exports
160 imports <- resolveImports env m
161 imports <- resolveImports env m
161− renameInModule imports env (elaborateExports exps m)
162+ elaborateImports <$> renameInModule imports env (elaborateExports exps m)
164-- Make all exports for a module explicit. This may still effect modules that have an exports list,
165-- Make all exports for a module explicit. This may still effect modules that have an exports list,
@@ -170,6 +171,23 @@ elaborateExports exps (Module mn decls _) = Module mn decls (Just $
170 map TypeClassRef (exportedTypeClasses exps) ++
171 map TypeClassRef (exportedTypeClasses exps) ++
171 map ValueRef (exportedValues exps))
172 map ValueRef (exportedValues exps))
175+-- Add `import X ()` for any modules where there are only fully qualified references to members.
176+-- This ensures transitive instances are included when using a member from a module.
178+elaborateImports :: Module -> Module
179+elaborateImports (Module mn decls exps) = Module mn decls' exps
181+ decls' :: [Declaration]
183+ let (f, _, _, _, _) = everythingOnValues (++) (const []) fqValues (const []) (const []) (const [])
184+ in mkImport `map` nub (f `concatMap` decls) ++ decls
185+ fqValues :: Expr -> [ModuleName]
186+ fqValues (Var (Qualified (Just mn') _)) = [mn']
188+ mkImport :: ModuleName -> Declaration
189+ mkImport mn' = ImportDeclaration mn' (Qualifying []) Nothing
174-- Replaces all local names with qualified names within a module and checks that all existing
192-- Replaces all local names with qualified names within a module and checks that all existing
175-- qualified names are valid.
193-- qualified names are valid.