git.iko.soy/rowtype-yoga/purescript-native
on golang help sign in
Import instances when referencing qualified values

Resolves #667

commit5eea29453dd64b1ef33637d13c5e0bb3dafea11c authorGary Burgess <gary.burgess@gmail.com> dateThu 13 Nov 2014, 23:40 (12 years ago) parent99d2d7f
2 files changed+26−2
examples/passing/ImplicitEmptyImport.purs+6 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/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.