git.iko.soy/rowtype-yoga/purescript-native
on golang help sign in
Merge pull request #705 from purescript/667
f8578d1Phil Freeman
examples/passing/ImplicitEmptyImport.pursnew file+6
@@ -0,0 +1,6 @@
1+module Main where
2+
3+main = do
4+ Debug.Trace.trace "Hello"
5+ Debug.Trace.trace "Goodbye"
6+ Debug.Trace.trace "Done"
src/Language/PureScript/Declarations.hs+1−2
@@ -176,8 +176,7 @@ data Declaration
176 --
176 --
177 | FixityDeclaration Fixity String
177 | FixityDeclaration Fixity String
178 -- |
178 -- |
179− -- A module import (module name, optional set of identifiers to import,
179+ -- A module import (module name, qualified/unqualified/hiding, optional "qualified as" name)
180− -- optional set of identifiers to hide, optional "qualified as" name)
181 --
180 --
182 | ImportDeclaration ModuleName ImportDeclarationType (Maybe ModuleName)
181 | ImportDeclaration ModuleName ImportDeclarationType (Maybe ModuleName)
183 -- |
182 -- |
src/Language/PureScript/Sugar/Names.hs+20−2
@@ -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
6--
6--
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 :
10--
10--
@@ -16,6 +16,7 @@ module Language.PureScript.Sugar.Names (
16 desugarImports
16 desugarImports
17) where
17) where
18
18
19+import Data.List (nub)
19import Data.Maybe (fromMaybe, isJust, mapMaybe)
20import Data.Maybe (fromMaybe, isJust, mapMaybe)
20import Data.Monoid ((<>))
21import Data.Monoid ((<>))
21
22
@@ -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)
162
163
163-- |
164-- |
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))
172
173
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+
173-- |
191-- |
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.