@@ -16,7 +16,7 @@ import Control.Monad.Error.Class (MonadError(..))
1616import Control.Monad.State.Lazy
1717import Control.Monad.Writer (MonadWriter(..), censor)
1818
19−import Data.List (find, nub)
19+import Data.List (nub)
2020import Data.Maybe (fromMaybe, mapMaybe)
2121import qualified Data.Map as M
2222import qualified Data.Set as S
@@ -65,9 +65,9 @@ desugarImportsWithEnv externs modules = do
6565 externsEnv env ExternsFile{..} = do
6666 let members = Exports{..}
6767 ss = internalModuleSourceSpan "<Externs>"
68− env' = M.insert efModuleName (ss, nullImports, members) env
68+ env' = M.insert efModuleName (ss, primImports, members) env
6969 fromEFImport (ExternsImport mn mt qmn) = (mn, [(Nothing, Just mt, qmn)])
70− imps <- foldM (resolveModuleImport env') nullImports (map fromEFImport efImports)
70+ imps <- foldM (resolveModuleImport env') primImports (map fromEFImport efImports)
7171 exps <- resolveExports env' ss efModuleName imps members efExports
7272 return $ M.insert efModuleName (ss, imps, exps) env
7373 where
@@ -101,7 +101,7 @@ desugarImportsWithEnv externs modules = do
101101 Just m' -> throwError . errorMessage $ RedefinedModule mn [envModuleSourceSpan m', ss]
102102 Nothing -> do
103103 members <- findExportable m
104− let env' = M.insert mn (ss, nullImports, members) env
104+ let env' = M.insert mn (ss, primImports, members) env
105105 (m', imps) <- resolveImports env' m
106106 exps <- maybe (return members) (resolveExports env' ss mn imps members) refs
107107 return (m' : ms, M.insert mn (ss, imps, exps) env)
@@ -110,7 +110,7 @@ desugarImportsWithEnv externs modules = do
110110 renameInModule' env m@(Module _ _ mn _ _) =
111111 warnAndRethrow (addHint (ErrorInModule mn)) $ do
112112 let (_, imps, exps) = fromMaybe (internalError "Module is missing in renameInModule'") $ M.lookup mn env
113− (m', used) <- flip runStateT M.empty $ renameInModule env imps (elaborateExports exps m)
113+ (m', used) <- flip runStateT M.empty $ renameInModule imps (elaborateExports exps m)
114114 lintImports m' env used
115115 return m'
116116
@@ -147,11 +147,10 @@ elaborateExports exps (Module ss coms mn decls refs) =
147147renameInModule
148148 :: forall m
149149 . (MonadError MultipleErrors m, MonadWriter MultipleErrors m, MonadState UsedImports m)
150− => Env
151− -> Imports
150+ => Imports
152151 -> Module
153152 -> m Module
154−renameInModule env imports (Module ss coms mn decls exps) =
153+renameInModule imports (Module ss coms mn decls exps) =
155154 Module ss coms mn <$> parU decls go <*> pure exps
156155 where
157156
@@ -219,10 +218,9 @@ renameInModule env imports (Module ss coms mn decls exps) =
219218 (,) s <$> (ConstructorBinder <$> updateDataConstructorName name pos <*> pure b)
220219 updateBinder s@(pos, _) (OpBinder op) =
221220 (,) s <$> (OpBinder <$> updateValueOpName op pos)
222− updateBinder s (TypedBinder t b) = do
223− (s'@ (span', _), b') <- updateBinder s b
224− t' <- updateTypesEverywhere span' t
225− return (s', TypedBinder t' b')
221+ updateBinder s@(pos, _) (TypedBinder t b) = do
222+ t' <- updateTypesEverywhere pos t
223+ return (s, TypedBinder t' b)
226224 updateBinder s v =
227225 return (s, v)
228226
@@ -244,82 +242,51 @@ renameInModule env imports (Module ss coms mn decls exps) =
244242 updateType :: Type -> m Type
245243 updateType (TypeOp name) = TypeOp <$> updateTypeOpName name pos
246244 updateType (TypeConstructor name) = TypeConstructor <$> updateTypeName name pos
247− updateType (ConstrainedType cs t) = ConstrainedType <$> updateConstraints pos cs <*> pure t
245+ updateType (ConstrainedType cs t) = ConstrainedType <$> traverse updateInConstraint cs <*> pure t
248246 updateType t = return t
247+ updateInConstraint :: Constraint -> m Constraint
248+ updateInConstraint (Constraint name ts info) =
249+ Constraint <$> updateClassName name pos <*> pure ts <*> pure info
249250
250251 updateConstraints :: Maybe SourceSpan -> [Constraint] -> m [Constraint]
251− updateConstraints pos = traverse (\(Constraint name ts info) ->
252− Constraint <$> updateClassName name pos
253− <*> traverse (updateTypesEverywhere pos) ts
254− <*> pure info)
252+ updateConstraints pos = traverse $ \(Constraint name ts info) ->
253+ Constraint
254+ <$> updateClassName name pos
255+ <*> traverse (updateTypesEverywhere pos) ts
256+ <*> pure info
255257
256258 updateTypeName
257259 :: Qualified (ProperName 'TypeName)
258260 -> Maybe SourceSpan
259261 -> m (Qualified (ProperName 'TypeName))
260− updateTypeName =
261− update (importedTypes imports) (resolveType . exportedTypes) TyName
262+ updateTypeName = update (importedTypes imports) TyName
262263
263264 updateTypeOpName
264265 :: Qualified (OpName 'TypeOpName)
265266 -> Maybe SourceSpan
266267 -> m (Qualified (OpName 'TypeOpName))
267− updateTypeOpName =
268− update (importedTypeOps imports) (resolve . exportedTypeOps) TyOpName
268+ updateTypeOpName = update (importedTypeOps imports) TyOpName
269269
270270 updateDataConstructorName
271271 :: Qualified (ProperName 'ConstructorName)
272272 -> Maybe SourceSpan
273273 -> m (Qualified (ProperName 'ConstructorName))
274− updateDataConstructorName =
275− update
276− (importedDataConstructors imports)
277− (resolveDctor . exportedTypes)
278− DctorName
274+ updateDataConstructorName = update (importedDataConstructors imports) DctorName
279275
280276 updateClassName
281277 :: Qualified (ProperName 'ClassName)
282278 -> Maybe SourceSpan
283279 -> m (Qualified (ProperName 'ClassName))
284− updateClassName =
285− update
286− (importedTypeClasses imports)
287− (resolve . exportedTypeClasses)
288− TyClassName
280+ updateClassName = update (importedTypeClasses imports) TyClassName
289281
290282 updateValueName :: Qualified Ident -> Maybe SourceSpan -> m (Qualified Ident)
291− updateValueName =
292− update (importedValues imports) (resolve . exportedValues) IdentName
283+ updateValueName = update (importedValues imports) IdentName
293284
294285 updateValueOpName
295286 :: Qualified (OpName 'ValueOpName)
296287 -> Maybe SourceSpan
297288 -> m (Qualified (OpName 'ValueOpName))
298− updateValueOpName =
299− update (importedValueOps imports) (resolve . exportedValueOps) ValOpName
300−
301− -- Used when performing an update to qualify values and classes with their
302− -- module of original definition.
303− resolve :: Ord a => M.Map a ModuleName -> a -> Maybe (Qualified a)
304− resolve as name = mkQualified name <$> name `M.lookup` as
305−
306− -- Used when performing an update to qualify types with their module of
307− -- original definition.
308− resolveType
309− :: M.Map (ProperName 'TypeName) ([ProperName 'ConstructorName], ModuleName)
310− -> ProperName 'TypeName
311− -> Maybe (Qualified (ProperName 'TypeName))
312− resolveType tys name =
313− mkQualified name . snd <$> M.lookup name tys
314−
315− -- Used when performing an update to qualify data constructors with their
316− -- module of original definition.
317− resolveDctor
318− :: M.Map (ProperName 'TypeName) ([ProperName 'ConstructorName], ModuleName)
319− -> ProperName 'ConstructorName
320− -> Maybe (Qualified (ProperName 'ConstructorName))
321− resolveDctor tys name =
322− mkQualified name . snd <$> find (elem name . fst) tys
289+ updateValueOpName = update (importedValueOps imports) ValOpName
323290
324291 -- Update names so unqualified references become qualified, and locally
325292 -- qualified references are replaced with their canoncial qualified names
@@ -327,12 +294,11 @@ renameInModule env imports (Module ss coms mn decls exps) =
327294 update
328295 :: (Ord a, Show a)
329296 => M.Map (Qualified a) [ImportRecord a]
330− -> (Exports -> a -> Maybe (Qualified a))
331297 -> (a -> Name)
332298 -> Qualified a
333299 -> Maybe SourceSpan
334300 -> m (Qualified a)
335− update imps getE toName qname@(Qualified mn' name) pos = positioned $
301+ update imps toName qname@(Qualified mn' name) pos = positioned $
336302 case (M.lookup qname imps, mn') of
337303
338304 -- We found the name in our imports, so we return the name for it,
@@ -354,13 +320,9 @@ renameInModule env imports (Module ss coms mn decls exps) =
354320 -- by qualified importing). If that's not the case, then we just need to
355321 -- check it refers to a symbol in another module.
356322 (Nothing, Just mn'') ->
357− case M.lookup mn'' env of
358− Nothing
359− | mn'' `S.member` importedVirtualModules imports -> throwUnknown
360− | otherwise ->
361− throwError . errorMessage .
362− UnknownName . Qualified Nothing $ ModName mn''
363− Just env' -> maybe throwUnknown return (getE (envModuleExports env') name)
323+ if mn'' `S.member` importedQualModules imports || mn'' `S.member` importedModules imports
324+ then throwUnknown
325+ else throwError . errorMessage . UnknownName . Qualified Nothing $ ModName mn''
364326
365327 -- If neither of the above cases are true then it's an undefined or
366328 -- unimported symbol.