git.iko.soy/rowtype-yoga/purescript-native
on golang help sign in
Merge pull request #705 from purescript/667

Import instances when referencing qualified values

commitf8578d15cb43f2027d4f54ed12da6b0d2a06a71e authorPhil Freeman <paf31@cantab.net> dateThu 13 Nov 2014, 16:15 (12 years ago) parent99d2d7f240558c
3 files changed+27−4
examples/passing/ImplicitEmptyImport.purs+6 src/Language/PureScript/Declarations.hs+1−2 src/Language/PureScript/Sugar/Names.hs+20−2
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
176176 --
177177 | FixityDeclaration Fixity String
178178 -- |
179− -- A module import (module name, optional set of identifiers to import,
180− -- optional set of identifiers to hide, optional "qualified as" name)
179+ -- A module import (module name, qualified/unqualified/hiding, optional "qualified as" name)
181180 --
182181 | ImportDeclaration ModuleName ImportDeclarationType (Maybe ModuleName)
183182 -- |
src/Language/PureScript/Sugar/Names.hs+20−2
@@ -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.