@@ -99,7 +99,8 @@ resolveImports env (Module ss coms currentModule decls exps) =
9999
100100 return ()
101101
102− let scope = M.insert currentModule [(Nothing, Implicit, Nothing)] imports
102+ let imports' = M.map (map (\(ss', dt, mmn) -> (ss', Just dt, mmn))) imports
103+ scope = M.insert currentModule [(Nothing, Nothing, Nothing)] imports'
103104 resolved <- foldM (resolveModuleImport env) nullImports (M.toList scope)
104105 return (Module ss coms currentModule decls' exps, resolved)
105106
@@ -162,11 +163,13 @@ resolveModuleImport
162163 . (Applicative m, MonadError MultipleErrors m, MonadWriter MultipleErrors m)
163164 => Env
164165 -> Imports
165− -> (ModuleName, [(Maybe SourceSpan, ImportDeclarationType, Maybe ModuleName)])
166+ -> (ModuleName, [(Maybe SourceSpan, Maybe ImportDeclarationType, Maybe ModuleName)])
166167 -> m Imports
167168resolveModuleImport env ie (mn, imps) = foldM go ie imps
168169 where
169− go :: Imports -> (Maybe SourceSpan, ImportDeclarationType, Maybe ModuleName) -> m Imports
170+ go :: Imports
171+ -> (Maybe SourceSpan, Maybe ImportDeclarationType, Maybe ModuleName)
172+ -> m Imports
170173 go ie' (pos, typ, impQual) = do
171174 modExports <- positioned $ maybe (throwError . errorMessage $ UnknownModule mn) (return . envModuleExports) $ mn `M.lookup` env
172175 let virtualModules = importedVirtualModules ie'
@@ -189,15 +192,16 @@ resolveImport
189192 -> Exports
190193 -> Imports
191194 -> Maybe ModuleName
192− -> ImportDeclarationType
195+ -> Maybe ImportDeclarationType
193196 -> m Imports
194197resolveImport importModule exps imps impQual = resolveByType
195198 where
196199
197− resolveByType :: ImportDeclarationType -> m Imports
198− resolveByType Implicit = importAll importExplicit
199− resolveByType (Explicit refs) = checkRefs False refs >> foldM importExplicit imps refs
200− resolveByType (Hiding refs) = do
200+ resolveByType :: Maybe ImportDeclarationType -> m Imports
201+ resolveByType Nothing = importAll (importRef Local)
202+ resolveByType (Just Implicit) = importAll (importRef FromImplicit)
203+ resolveByType (Just (Explicit refs)) = checkRefs False refs >> foldM (importRef FromExplicit) imps refs
204+ resolveByType (Just (Hiding refs)) = do
201205 imps' <- checkRefs True refs >> importAll (importNonHidden refs)
202206 let isEmptyImport
203207 = M.null (importedTypes imps')
@@ -246,7 +250,7 @@ resolveImport importModule exps imps impQual = resolveByType
246250
247251 importNonHidden :: [DeclarationRef] -> Imports -> DeclarationRef -> m Imports
248252 importNonHidden hidden m ref | isHidden ref = return m
249− | otherwise = importExplicit m ref
253+ | otherwise = importRef FromImplicit m ref
250254 where
251255 -- TODO: rework this to be not confusing
252256 isHidden :: DeclarationRef -> Bool
@@ -268,27 +272,26 @@ resolveImport importModule exps imps impQual = resolveByType
268272 imp'' <- foldM (\m (name, _) -> importer m (ValueRef name)) imp' (exportedValues exps)
269273 foldM (\m (name, _) -> importer m (TypeClassRef name)) imp'' (exportedTypeClasses exps)
270274
271− -- Import something explicitly
272− importExplicit :: Imports -> DeclarationRef -> m Imports
273− importExplicit imp (PositionedDeclarationRef pos _ r) =
274− warnAndRethrowWithPosition pos $ importExplicit imp r
275− importExplicit imp (ValueRef name) = do
276− let values' = updateImports (importedValues imp) (exportedValues exps) name
275+ importRef :: ImportProvenance -> Imports -> DeclarationRef -> m Imports
276+ importRef prov imp (PositionedDeclarationRef pos _ r) =
277+ warnAndRethrowWithPosition pos $ importRef prov imp r
278+ importRef prov imp (ValueRef name) = do
279+ let values' = updateImports (importedValues imp) (exportedValues exps) name prov
277280 return $ imp { importedValues = values' }
278− importExplicit imp (TypeRef name dctors) = do
279− let types' = updateImports (importedTypes imp) (first fst `map` exportedTypes exps) name
281+ importRef prov imp (TypeRef name dctors) = do
282+ let types' = updateImports (importedTypes imp) (first fst `map` exportedTypes exps) name prov
280283 let exportedDctors :: [(ProperName 'ConstructorName, ModuleName)]
281284 exportedDctors = allExportedDataConstructors name
282285 dctorNames :: [ProperName 'ConstructorName]
283286 dctorNames = fst `map` exportedDctors
284287 maybe (return ()) (traverse_ $ checkDctorExists name dctorNames) dctors
285288 when (null dctorNames && isNothing dctors) . tell . errorMessage $ MisleadingEmptyTypeImport importModule name
286− let dctors' = foldl (\m -> updateImports m exportedDctors) (importedDataConstructors imp) (fromMaybe dctorNames dctors)
289+ let dctors' = foldl (\m d -> updateImports m exportedDctors d prov) (importedDataConstructors imp) (fromMaybe dctorNames dctors)
287290 return $ imp { importedTypes = types', importedDataConstructors = dctors' }
288− importExplicit imp (TypeClassRef name) = do
289− let typeClasses' = updateImports (importedTypeClasses imp) (exportedTypeClasses exps) name
291+ importRef prov imp (TypeClassRef name) = do
292+ let typeClasses' = updateImports (importedTypeClasses imp) (exportedTypeClasses exps) name prov
290293 return $ imp { importedTypeClasses = typeClasses' }
291− importExplicit _ _ = internalError "Invalid argument to importExplicit"
294+ importRef _ _ _ = internalError "Invalid argument to importRef"
292295
293296 -- Find all exported data constructors for a given type
294297 allExportedDataConstructors :: ProperName 'TypeName -> [(ProperName 'ConstructorName, ModuleName)]
@@ -300,11 +303,17 @@ resolveImport importModule exps imps impQual = resolveByType
300303 -- Add something to an import resolution list
301304 updateImports
302305 :: (Ord a)
303− => M.Map (Qualified a) [(Qualified a, ModuleName)]
306+ => M.Map (Qualified a) [ImportRecord a]
304307 -> [(a, ModuleName)]
305308 -> a
306− -> M.Map (Qualified a) [(Qualified a, ModuleName)]
307− updateImports imps' exps' name =
308− let mnOrig = fromMaybe (internalError "Invalid state in updateImports") (name `lookup` exps')
309− currNames = fromMaybe [] (M.lookup (Qualified impQual name) imps')
310− in M.insert (Qualified impQual name) ((Qualified (Just importModule) name, mnOrig) : currNames) imps'
309+ -> ImportProvenance
310+ -> M.Map (Qualified a) [ImportRecord a]
311+ updateImports imps' exps' name prov =
312+ let
313+ mnOrig = fromMaybe (internalError "Invalid state in updateImports") (name `lookup` exps')
314+ rec = ImportRecord (Qualified (Just importModule) name) mnOrig prov
315+ in
316+ M.alter
317+ (\currNames -> Just $ rec : fromMaybe [] currNames)
318+ (Qualified impQual name)
319+ imps'