@@ -10,7 +10,7 @@ module Language.PureScript.Sugar.Names
11import Prelude.Compat
11import Prelude.Compat
13−import Control.Arrow (first, second)
13+import Control.Arrow (first)
14import Control.Monad
14import Control.Monad
15import Control.Monad.Error.Class (MonadError(..))
15import Control.Monad.Error.Class (MonadError(..))
16import Control.Monad.State.Lazy
16import Control.Monad.State.Lazy
@@ -84,16 +84,19 @@ desugarImportsWithEnv externs modules = do
84 toExportedType _ = Nothing
84 toExportedType _ = Nothing
86 exportedTypeOps :: M.Map (OpName 'TypeOpName) ModuleName
86 exportedTypeOps :: M.Map (OpName 'TypeOpName) ModuleName
87− exportedTypeOps = M.fromList $ (, efModuleName) <$> mapMaybe getTypeOpRef efExports
87+ exportedTypeOps = exportedRefs getTypeOpRef
89 exportedTypeClasses :: M.Map (ProperName 'ClassName) ModuleName
89 exportedTypeClasses :: M.Map (ProperName 'ClassName) ModuleName
90− exportedTypeClasses = M.fromList $ (, efModuleName) <$> mapMaybe getTypeClassRef efExports
90+ exportedTypeClasses = exportedRefs getTypeClassRef
92 exportedValues :: M.Map Ident ModuleName
92 exportedValues :: M.Map Ident ModuleName
93− exportedValues = M.fromList $ (, efModuleName) <$> mapMaybe getValueRef efExports
93+ exportedValues = exportedRefs getValueRef
95 exportedValueOps :: M.Map (OpName 'ValueOpName) ModuleName
95 exportedValueOps :: M.Map (OpName 'ValueOpName) ModuleName
96+ exportedValueOps = exportedRefs getValueOpRef
98+ exportedRefs :: Ord a => (DeclarationRef -> Maybe a) -> M.Map a ModuleName
96− exportedValueOps = M.fromList $ (, efModuleName) <$> mapMaybe getValueOpRef efExports
99+ exportedRefs f = M.fromList $ (, efModuleName) <$> mapMaybe f efExports
98 updateEnv :: ([Module], Env) -> Module -> m ([Module], Env)
101 updateEnv :: ([Module], Env) -> Module -> m ([Module], Env)
99 updateEnv (ms, env) m@(Module ss _ mn _ refs) =
102 updateEnv (ms, env) m@(Module ss _ mn _ refs) =
@@ -110,9 +113,10 @@ desugarImportsWithEnv externs modules = do
110 renameInModule' env m@(Module _ _ mn _ _) =
113 renameInModule' env m@(Module _ _ mn _ _) =
111 warnAndRethrow (addHint (ErrorInModule mn)) $ do
114 warnAndRethrow (addHint (ErrorInModule mn)) $ do
112 let (_, imps, exps) = fromMaybe (internalError "Module is missing in renameInModule'") $ M.lookup mn env
115 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)
116+ (m', used) <- flip runStateT M.empty $ renameInModule imps m
117+ let m'' = elaborateExports exps m'
114− lintImports m' env used
118+ lintImports m'' env used
115− return m'
119+ return m''
118-- Make all exports for a module explicit. This may still effect modules that
122-- Make all exports for a module explicit. This may still effect modules that
@@ -121,24 +125,25 @@ desugarImportsWithEnv externs modules = do
122elaborateExports :: Exports -> Module -> Module
126elaborateExports :: Exports -> Module -> Module
123elaborateExports exps (Module ss coms mn decls refs) =
127elaborateExports exps (Module ss coms mn decls refs) =
124− Module ss coms mn decls $
128+ Module ss coms mn decls $ Just
125− Just $ map (\(ctor, dctors) -> TypeRef ctor (Just dctors)) myTypes ++
129+ $ elaboratedTypeRefs
126− map TypeOpRef (my exportedTypeOps) ++
130+ ++ go TypeOpRef exportedTypeOps
127− map TypeClassRef (my exportedTypeClasses) ++
131+ ++ go TypeClassRef exportedTypeClasses
128− map ValueRef (my exportedValues) ++
132+ ++ go ValueRef exportedValues
129− map ValueOpRef (my exportedValueOps) ++
133+ ++ go ValueOpRef exportedValueOps
130− maybe [] (filter isModuleRef) refs
134+ ++ maybe [] (filter isModuleRef) refs
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)
137− myTypes :: [(ProperName 'TypeName, [ProperName 'ConstructorName])]
137+ elaboratedTypeRefs :: [DeclarationRef]
138− myTypes = second fst <$> filt ((== mn) . snd) exportedTypes
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
140− filt :: (b -> Bool) -> (Exports -> M.Map a b) -> [(a, b)]
143+ go :: (a -> DeclarationRef) -> (Exports -> M.Map a ModuleName) -> [DeclarationRef]
141− filt predicate f = M.toList $ predicate `M.filter` f exps
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)
144-- Replaces all local names with qualified names within a module and checks that all existing
149-- Replaces all local names with qualified names within a module and checks that all existing