@@ -99,7 +99,7 @@ resolveImports env (Module ss coms currentModule decls exps) =
9999 return ()
100100
101101 let scope = M.insert currentModule [(Nothing, Implicit True, Nothing)] imports
102− resolved <- foldM (resolveModuleImport currentModule env) nullImports (M.toList scope)
102+ resolved <- foldM (resolveModuleImport env) nullImports (M.toList scope)
103103 return (Module ss coms currentModule decls' exps, resolved)
104104
105105 where
@@ -159,18 +159,17 @@ resolveImports env (Module ss coms currentModule decls exps) =
159159resolveModuleImport
160160 :: forall m
161161 . (Applicative m, MonadError MultipleErrors m, MonadWriter MultipleErrors m)
162− => ModuleName
163− -> Env
162+ => Env
164163 -> Imports
165164 -> (ModuleName, [(Maybe SourceSpan, ImportDeclarationType, Maybe ModuleName)])
166165 -> m Imports
167−resolveModuleImport currentModule env ie (mn, imps) = foldM go ie imps
166+resolveModuleImport env ie (mn, imps) = foldM go ie imps
168167 where
169168 go :: Imports -> (Maybe SourceSpan, ImportDeclarationType, Maybe ModuleName) -> m Imports
170169 go ie' (pos, typ, impQual) = do
171170 modExports <- positioned $ maybe (throwError . errorMessage $ UnknownModule mn) (return . envModuleExports) $ mn `M.lookup` env
172171 let ie'' = ie' { importedModules = mn : importedModules ie' }
173− positioned $ resolveImport currentModule mn modExports ie'' impQual typ
172+ positioned $ resolveImport mn modExports ie'' impQual typ
174173 where
175174 positioned err = case pos of
176175 Nothing -> err
@@ -183,13 +182,12 @@ resolveImport
183182 :: forall m
184183 . (Applicative m, MonadError MultipleErrors m, MonadWriter MultipleErrors m)
185184 => ModuleName
186− -> ModuleName
187185 -> Exports
188186 -> Imports
189187 -> Maybe ModuleName
190188 -> ImportDeclarationType
191189 -> m Imports
192−resolveImport currentModule importModule exps imps impQual = resolveByType
190+resolveImport importModule exps imps impQual = resolveByType
193191 where
194192
195193 resolveByType :: ImportDeclarationType -> m Imports
@@ -262,20 +260,20 @@ resolveImport currentModule importModule exps imps impQual = resolveByType
262260 importExplicit imp (PositionedDeclarationRef pos _ r) =
263261 warnAndRethrowWithPosition pos $ importExplicit imp r
264262 importExplicit imp (ValueRef name) = do
265− values' <- updateImports (importedValues imp) showIdent (exportedValues exps) name
263+ let values' = updateImports (importedValues imp) (exportedValues exps) name
266264 return $ imp { importedValues = values' }
267265 importExplicit imp (TypeRef name dctors) = do
268− types' <- updateImports (importedTypes imp) runProperName (first fst `map` exportedTypes exps) name
266+ let types' = updateImports (importedTypes imp) (first fst `map` exportedTypes exps) name
269267 let exportedDctors :: [(ProperName, ModuleName)]
270268 exportedDctors = allExportedDataConstructors name
271269 dctorNames :: [ProperName]
272270 dctorNames = fst `map` exportedDctors
273271 maybe (return ()) (traverse_ $ checkDctorExists name dctorNames) dctors
274272 when (null dctorNames && isNothing dctors) . tell . errorMessage $ MisleadingEmptyTypeImport importModule name
275− dctors' <- foldM (\m -> updateImports m runProperName exportedDctors) (importedDataConstructors imp) (fromMaybe dctorNames dctors)
273+ let dctors' = foldl (\m -> updateImports m exportedDctors) (importedDataConstructors imp) (fromMaybe dctorNames dctors)
276274 return $ imp { importedTypes = types', importedDataConstructors = dctors' }
277275 importExplicit imp (TypeClassRef name) = do
278− typeClasses' <- updateImports (importedTypeClasses imp) runProperName (exportedTypeClasses exps) name
276+ let typeClasses' = updateImports (importedTypeClasses imp) (exportedTypeClasses exps) name
279277 return $ imp { importedTypeClasses = typeClasses' }
280278 importExplicit _ _ = internalError "Invalid argument to importExplicit"
281279
@@ -286,33 +284,14 @@ resolveImport currentModule importModule exps imps impQual = resolveByType
286284 Nothing -> internalError "Invalid state in allExportedDataConstructors"
287285 Just ((_, dctors), mn) -> map (, mn) dctors
288286
289− -- Add something to the Imports if it does not already exist there
287+ -- Add something to an import resolution list
290288 updateImports
291289 :: (Ord a)
292− => M.Map (Qualified a) (Qualified a, ModuleName)
293− -> (a -> String)
290+ => M.Map (Qualified a) [(Qualified a, ModuleName)]
294291 -> [(a, ModuleName)]
295292 -> a
296− -> m (M.Map (Qualified a) (Qualified a, ModuleName))
297− updateImports imps' render exps' name = case M.lookup (Qualified impQual name) imps' of
298−
299− -- If the name is not already present add it to the list, after looking up
300− -- where it was originally defined
301− Nothing ->
302− let mnOrig = fromMaybe (internalError "Invalid state in updateImports") (name `lookup` exps')
303− in return $ M.insert (Qualified impQual name) (Qualified (Just importModule) name, mnOrig) imps'
304−
305− -- If the name already is present check whether it's a duplicate import
306− -- before rejecting it. For example, if module A defines X, and module B
307− -- re-exports A, importing A and B in C should not result in a "conflicting
308− -- import for `x`" error
309− Just (Qualified (Just mn) _, mnOrig)
310− | mnOrig == fromMaybe (internalError "Invalid state in updateImports") (name `lookup` exps') -> return imps'
311− | otherwise -> throwError . errorMessage $ err
312− where
313− err = if currentModule `elem` [mn, importModule]
314− then ConflictingImport (render name) importModule
315− else ConflictingImports (render name) mn importModule
316−
317− Just (Qualified Nothing _, _) ->
318− internalError "Invalid state in updateImports"
293+ -> M.Map (Qualified a) [(Qualified a, ModuleName)]
294+ updateImports imps' exps' name =
295+ let mnOrig = fromMaybe (internalError "Invalid state in updateImports") (name `lookup` exps')
296+ currNames = fromMaybe [] (M.lookup (Qualified impQual name) imps')
297+ in M.insert (Qualified impQual name) ((Qualified (Just importModule) name, mnOrig) : currNames) imps'