@@ -4,7 +4,7 @@
44-- Copyright : (c) 2013-14 Phil Freeman, (c) 2014 Gary Burgess, and other contributors
55-- License : MIT
66--
7−-- Maintainer : Phil Freeman <paf31@cantab.net>
7+-- Maintainer : Phil Freeman <paf31@cantab.net>, Gary Burgess <gary.burgess@gmail.com>
88-- Stability : experimental
99-- Portability :
1010--
@@ -16,6 +16,7 @@ module Language.PureScript.Sugar.Names (
1616 desugarImports
1717) where
1818
19+import Data.List (nub)
1920import Data.Maybe (fromMaybe, isJust, mapMaybe)
2021import Data.Monoid ((<>))
2122
@@ -158,7 +159,7 @@ desugarImports modules = do
158159 let env = M.update (\_ -> M.lookup mn unfilteredExports) mn exports
159160 let exps = fromMaybe (error "Module is missing in renameInModule'") $ M.lookup mn exports
160161 imports <- resolveImports env m
161− renameInModule imports env (elaborateExports exps m)
162+ elaborateImports <$> renameInModule imports env (elaborateExports exps m)
162163
163164-- |
164165-- 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 $
170171 map TypeClassRef (exportedTypeClasses exps) ++
171172 map ValueRef (exportedValues exps))
172173
174+-- |
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.
177+--
178+elaborateImports :: Module -> Module
179+elaborateImports (Module mn decls exps) = Module mn decls' exps
180+ where
181+ decls' :: [Declaration]
182+ decls' =
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']
187+ fqValues _ = []
188+ mkImport :: ModuleName -> Declaration
189+ mkImport mn' = ImportDeclaration mn' (Qualifying []) Nothing
190+
173191-- |
174192-- Replaces all local names with qualified names within a module and checks that all existing
175193-- qualified names are valid.