@@ -10,7 +10,7 @@ module Language.PureScript.Sugar.Names
1010
1111import Prelude.Compat
1212
13−import Control.Arrow (first, second)
13+import Control.Arrow (first)
1414import Control.Monad
1515import Control.Monad.Error.Class (MonadError(..))
1616import Control.Monad.State.Lazy
@@ -84,16 +84,19 @@ desugarImportsWithEnv externs modules = do
8484 toExportedType _ = Nothing
8585
8686 exportedTypeOps :: M.Map (OpName 'TypeOpName) ModuleName
87− exportedTypeOps = M.fromList $ (, efModuleName) <$> mapMaybe getTypeOpRef efExports
87+ exportedTypeOps = exportedRefs getTypeOpRef
8888
8989 exportedTypeClasses :: M.Map (ProperName 'ClassName) ModuleName
90− exportedTypeClasses = M.fromList $ (, efModuleName) <$> mapMaybe getTypeClassRef efExports
90+ exportedTypeClasses = exportedRefs getTypeClassRef
9191
9292 exportedValues :: M.Map Ident ModuleName
93− exportedValues = M.fromList $ (, efModuleName) <$> mapMaybe getValueRef efExports
93+ exportedValues = exportedRefs getValueRef
9494
9595 exportedValueOps :: M.Map (OpName 'ValueOpName) ModuleName
96− exportedValueOps = M.fromList $ (, efModuleName) <$> mapMaybe getValueOpRef efExports
96+ exportedValueOps = exportedRefs getValueOpRef
97+
98+ exportedRefs :: Ord a => (DeclarationRef -> Maybe a) -> M.Map a ModuleName
99+ exportedRefs f = M.fromList $ (, efModuleName) <$> mapMaybe f efExports
97100
98101 updateEnv :: ([Module], Env) -> Module -> m ([Module], Env)
99102 updateEnv (ms, env) m@(Module ss _ mn _ refs) =
@@ -110,9 +113,10 @@ desugarImportsWithEnv externs modules = do
110113 renameInModule' env m@(Module _ _ mn _ _) =
111114 warnAndRethrow (addHint (ErrorInModule mn)) $ do
112115 let (_, imps, exps) = fromMaybe (internalError "Module is missing in renameInModule'") $ M.lookup mn env
113− (m', used) <- flip runStateT M.empty $ renameInModule imps (elaborateExports exps m)
114− lintImports m' env used
115− return m'
116+ (m', used) <- flip runStateT M.empty $ renameInModule imps m
117+ let m'' = elaborateExports exps m'
118+ lintImports m'' env used
119+ return m''
116120
117121-- |
118122-- Make all exports for a module explicit. This may still effect modules that
@@ -121,24 +125,25 @@ desugarImportsWithEnv externs modules = do
121125--
122126elaborateExports :: Exports -> Module -> Module
123127elaborateExports exps (Module ss coms mn decls refs) =
124− Module ss coms mn decls $
125− Just $ map (\(ctor, dctors) -> TypeRef ctor (Just dctors)) myTypes ++
126− map TypeOpRef (my exportedTypeOps) ++
127− map TypeClassRef (my exportedTypeClasses) ++
128− map ValueRef (my exportedValues) ++
129− map ValueOpRef (my exportedValueOps) ++
130− maybe [] (filter isModuleRef) refs
128+ Module ss coms mn decls $ Just
129+ $ elaboratedTypeRefs
130+ ++ go TypeOpRef exportedTypeOps
131+ ++ go TypeClassRef exportedTypeClasses
132+ ++ go ValueRef exportedValues
133+ ++ go ValueOpRef exportedValueOps
134+ ++ maybe [] (filter isModuleRef) refs
131135 where
132− -- Extracts a list of values from the exports and filters out any values that
133− -- are re-exports from other modules.
134− my :: (Exports -> M.Map a ModuleName) -> [a]
135− my = map fst <$> filt (== mn)
136136
137− myTypes :: [(ProperName 'TypeName, [ProperName 'ConstructorName])]
138− myTypes = second fst <$> filt ((== mn) . snd) exportedTypes
137+ elaboratedTypeRefs :: [DeclarationRef]
138+ elaboratedTypeRefs =
139+ flip map (M.toList (exportedTypes exps)) $ \(tctor, (dctors, mn')) ->
140+ let ref = TypeRef tctor (Just dctors)
141+ in if mn == mn' then ref else ReExportRef mn' ref
139142
140− filt :: (b -> Bool) -> (Exports -> M.Map a b) -> [(a, b)]
141− filt predicate f = M.toList $ predicate `M.filter` f exps
143+ go :: (a -> DeclarationRef) -> (Exports -> M.Map a ModuleName) -> [DeclarationRef]
144+ go toRef select =
145+ flip map (M.toList (select exps)) $ \(export, mn') ->
146+ if mn == mn' then toRef export else ReExportRef mn' (toRef export)
142147
143148-- |
144149-- Replaces all local names with qualified names within a module and checks that all existing