@@ -99,7 +99,8 @@ resolveImports env (Module ss coms currentModule decls exps) =
100 return ()
100 return ()
102+ let imports' = M.map (map (\(ss', dt, mmn) -> (ss', Just dt, mmn))) imports
102− let scope = M.insert currentModule [(Nothing, Implicit, Nothing)] imports
103+ scope = M.insert currentModule [(Nothing, Nothing, Nothing)] imports'
103 resolved <- foldM (resolveModuleImport env) nullImports (M.toList scope)
104 resolved <- foldM (resolveModuleImport env) nullImports (M.toList scope)
104 return (Module ss coms currentModule decls' exps, resolved)
105 return (Module ss coms currentModule decls' exps, resolved)
@@ -162,11 +163,13 @@ resolveModuleImport
162 . (Applicative m, MonadError MultipleErrors m, MonadWriter MultipleErrors m)
163 . (Applicative m, MonadError MultipleErrors m, MonadWriter MultipleErrors m)
164 -> Imports
165 -> Imports
165− -> (ModuleName, [(Maybe SourceSpan, ImportDeclarationType, Maybe ModuleName)])
166+ -> (ModuleName, [(Maybe SourceSpan, Maybe ImportDeclarationType, Maybe ModuleName)])
166 -> m Imports
167 -> m Imports
167resolveModuleImport env ie (mn, imps) = foldM go ie imps
168resolveModuleImport env ie (mn, imps) = foldM go ie imps
169− go :: Imports -> (Maybe SourceSpan, ImportDeclarationType, Maybe ModuleName) -> m Imports
171+ -> (Maybe SourceSpan, Maybe ImportDeclarationType, Maybe ModuleName)
170 go ie' (pos, typ, impQual) = do
173 go ie' (pos, typ, impQual) = do
171 modExports <- positioned $ maybe (throwError . errorMessage $ UnknownModule mn) (return . envModuleExports) $ mn `M.lookup` env
174 modExports <- positioned $ maybe (throwError . errorMessage $ UnknownModule mn) (return . envModuleExports) $ mn `M.lookup` env
172 let virtualModules = importedVirtualModules ie'
175 let virtualModules = importedVirtualModules ie'
@@ -189,15 +192,16 @@ resolveImport
189 -> Exports
192 -> Exports
190 -> Imports
193 -> Imports
191 -> Maybe ModuleName
194 -> Maybe ModuleName
192− -> ImportDeclarationType
195+ -> Maybe ImportDeclarationType
193 -> m Imports
196 -> m Imports
194resolveImport importModule exps imps impQual = resolveByType
197resolveImport importModule exps imps impQual = resolveByType
197− resolveByType :: ImportDeclarationType -> m Imports
200+ resolveByType :: Maybe ImportDeclarationType -> m Imports
198− resolveByType Implicit = importAll importExplicit
201+ resolveByType Nothing = importAll (importRef Local)
202+ resolveByType (Just Implicit) = importAll (importRef FromImplicit)
199− resolveByType (Explicit refs) = checkRefs False refs >> foldM importExplicit imps refs
203+ resolveByType (Just (Explicit refs)) = checkRefs False refs >> foldM (importRef FromExplicit) imps refs
200− resolveByType (Hiding refs) = do
204+ resolveByType (Just (Hiding refs)) = do
201 imps' <- checkRefs True refs >> importAll (importNonHidden refs)
205 imps' <- checkRefs True refs >> importAll (importNonHidden refs)
202 let isEmptyImport
206 let isEmptyImport
203 = M.null (importedTypes imps')
207 = M.null (importedTypes imps')
@@ -246,7 +250,7 @@ resolveImport importModule exps imps impQual = resolveByType
247 importNonHidden :: [DeclarationRef] -> Imports -> DeclarationRef -> m Imports
251 importNonHidden :: [DeclarationRef] -> Imports -> DeclarationRef -> m Imports
248 importNonHidden hidden m ref | isHidden ref = return m
252 importNonHidden hidden m ref | isHidden ref = return m
249− | otherwise = importExplicit m ref
253+ | otherwise = importRef FromImplicit m ref
251 -- TODO: rework this to be not confusing
255 -- TODO: rework this to be not confusing
252 isHidden :: DeclarationRef -> Bool
256 isHidden :: DeclarationRef -> Bool
@@ -268,27 +272,26 @@ resolveImport importModule exps imps impQual = resolveByType
268 imp'' <- foldM (\m (name, _) -> importer m (ValueRef name)) imp' (exportedValues exps)
272 imp'' <- foldM (\m (name, _) -> importer m (ValueRef name)) imp' (exportedValues exps)
269 foldM (\m (name, _) -> importer m (TypeClassRef name)) imp'' (exportedTypeClasses exps)
273 foldM (\m (name, _) -> importer m (TypeClassRef name)) imp'' (exportedTypeClasses exps)
271− -- Import something explicitly
272− importExplicit :: Imports -> DeclarationRef -> m Imports
275+ importRef :: ImportProvenance -> Imports -> DeclarationRef -> m Imports
273− importExplicit imp (PositionedDeclarationRef pos _ r) =
276+ importRef prov imp (PositionedDeclarationRef pos _ r) =
274− warnAndRethrowWithPosition pos $ importExplicit imp r
277+ warnAndRethrowWithPosition pos $ importRef prov imp r
275− importExplicit imp (ValueRef name) = do
278+ importRef prov imp (ValueRef name) = do
276− let values' = updateImports (importedValues imp) (exportedValues exps) name
279+ let values' = updateImports (importedValues imp) (exportedValues exps) name prov
277 return $ imp { importedValues = values' }
280 return $ imp { importedValues = values' }
278− importExplicit imp (TypeRef name dctors) = do
281+ importRef prov imp (TypeRef name dctors) = do
279− let types' = updateImports (importedTypes imp) (first fst `map` exportedTypes exps) name
282+ let types' = updateImports (importedTypes imp) (first fst `map` exportedTypes exps) name prov
280 let exportedDctors :: [(ProperName 'ConstructorName, ModuleName)]
283 let exportedDctors :: [(ProperName 'ConstructorName, ModuleName)]
281 exportedDctors = allExportedDataConstructors name
284 exportedDctors = allExportedDataConstructors name
282 dctorNames :: [ProperName 'ConstructorName]
285 dctorNames :: [ProperName 'ConstructorName]
283 dctorNames = fst `map` exportedDctors
286 dctorNames = fst `map` exportedDctors
284 maybe (return ()) (traverse_ $ checkDctorExists name dctorNames) dctors
287 maybe (return ()) (traverse_ $ checkDctorExists name dctorNames) dctors
285 when (null dctorNames && isNothing dctors) . tell . errorMessage $ MisleadingEmptyTypeImport importModule name
288 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)
287 return $ imp { importedTypes = types', importedDataConstructors = dctors' }
290 return $ imp { importedTypes = types', importedDataConstructors = dctors' }
288− importExplicit imp (TypeClassRef name) = do
291+ importRef prov imp (TypeClassRef name) = do
289− let typeClasses' = updateImports (importedTypeClasses imp) (exportedTypeClasses exps) name
292+ let typeClasses' = updateImports (importedTypeClasses imp) (exportedTypeClasses exps) name prov
290 return $ imp { importedTypeClasses = typeClasses' }
293 return $ imp { importedTypeClasses = typeClasses' }
291− importExplicit _ _ = internalError "Invalid argument to importExplicit"
294+ importRef _ _ _ = internalError "Invalid argument to importRef"
293 -- Find all exported data constructors for a given type
296 -- Find all exported data constructors for a given type
294 allExportedDataConstructors :: ProperName 'TypeName -> [(ProperName 'ConstructorName, ModuleName)]
297 allExportedDataConstructors :: ProperName 'TypeName -> [(ProperName 'ConstructorName, ModuleName)]
@@ -300,11 +303,17 @@ resolveImport importModule exps imps impQual = resolveByType
300 -- Add something to an import resolution list
303 -- Add something to an import resolution list
301 updateImports
304 updateImports
302 :: (Ord a)
305 :: (Ord a)
303− => M.Map (Qualified a) [(Qualified a, ModuleName)]
306+ => M.Map (Qualified a) [ImportRecord a]
304 -> [(a, ModuleName)]
307 -> [(a, ModuleName)]
306− -> M.Map (Qualified a) [(Qualified a, ModuleName)]
310+ -> M.Map (Qualified a) [ImportRecord a]
307− updateImports imps' exps' name =
311+ updateImports imps' exps' name prov =
308− let mnOrig = fromMaybe (internalError "Invalid state in updateImports") (name `lookup` exps')
313+ 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'
314+ rec = ImportRecord (Qualified (Just importModule) name) mnOrig prov
317+ (\currNames -> Just $ rec : fromMaybe [] currNames)
318+ (Qualified impQual name)