Commit 3f13c20e authored by Edward Z. Yang's avatar Edward Z. Yang

Revert "Revert "Revert "Support for multiple signature files in scope."""

This reverts commit 214596de.
parent c234acbe
......@@ -184,7 +184,7 @@ initDs hsc_env mod rdr_env type_env fam_inst_env thing_inside
else do {
; result <- liftIO $ findImportedModule hsc_env modname Nothing
; case result of
FoundModule h -> loadModule err (fr_mod h)
Found _ mod -> loadModule err mod
_ -> pprPgmError "Unable to use Data Parallel Haskell (DPH):" err
} }
......
......@@ -562,29 +562,23 @@ getLinkDeps hsc_env hpt pls replace_osuf span mods
-- 3. For each dependent module, find its linkable
-- This will either be in the HPT or (in the case of one-shot
-- compilation) we may need to use maybe_getFileLinkable.
-- If the module is actually a signature, there won't be a
-- linkable (thus catMaybes)
-- compilation) we may need to use maybe_getFileLinkable
; let { osuf = objectSuf dflags }
; lnks_needed <- fmap Maybes.catMaybes
$ mapM (get_linkable osuf) mods_needed
; lnks_needed <- mapM (get_linkable osuf) mods_needed
; return (lnks_needed, pkgs_needed) }
where
dflags = hsc_dflags hsc_env
this_pkg = thisPackage dflags
-- | Given a list of modules @mods@, recursively discover all external
-- package and local module (according to @this_pkg@) dependencies.
--
-- The 'ModIface' contains the transitive closure of the module dependencies
-- within the current package, *except* for boot modules: if we encounter
-- a boot module, we have to find its real interface and discover the
-- dependencies of that. Hence we need to traverse the dependency
-- tree recursively. See bug #936, testcase ghci/prog007.
follow_deps :: [Module] -- modules to follow
-> UniqSet ModuleName -- accum. module dependencies
-> UniqSet PackageKey -- accum. package dependencies
-- The ModIface contains the transitive closure of the module dependencies
-- within the current package, *except* for boot modules: if we encounter
-- a boot module, we have to find its real interface and discover the
-- dependencies of that. Hence we need to traverse the dependency
-- tree recursively. See bug #936, testcase ghci/prog007.
follow_deps :: [Module] -- modules to follow
-> UniqSet ModuleName -- accum. module dependencies
-> UniqSet PackageKey -- accum. package dependencies
-> IO ([ModuleName], [PackageKey]) -- result
follow_deps [] acc_mods acc_pkgs
= return (uniqSetToList acc_mods, uniqSetToList acc_pkgs)
......@@ -607,7 +601,6 @@ getLinkDeps hsc_env hpt pls replace_osuf span mods
where is_boot (m,True) = Left m
is_boot (m,False) = Right m
-- Boot module dependencies which must be processed recursively
boot_deps' = filter (not . (`elementOfUniqSet` acc_mods)) boot_deps
acc_mods' = addListToUniqSet acc_mods (moduleName mod : mod_deps)
acc_pkgs' = addListToUniqSet acc_pkgs $ map fst pkg_deps
......@@ -638,37 +631,30 @@ getLinkDeps hsc_env hpt pls replace_osuf span mods
get_linkable osuf mod_name -- A home-package module
| Just mod_info <- lookupUFM hpt mod_name
= adjust_linkable (hm_iface mod_info)
(Maybes.expectJust "getLinkDeps" (hm_linkable mod_info))
= adjust_linkable (Maybes.expectJust "getLinkDeps" (hm_linkable mod_info))
| otherwise
= do -- It's not in the HPT because we are in one shot mode,
-- so use the Finder to get a ModLocation...
-- ezyang: I don't actually know how to trigger this codepath,
-- seeing as this is GHCi logic. Template Haskell, maybe?
mb_stuff <- findHomeModule hsc_env mod_name
case mb_stuff of
FoundExact loc mod -> found loc mod
Found loc mod -> found loc mod
_ -> no_obj mod_name
where
found loc mod = do {
-- ...and then find the linkable for it
mb_lnk <- findObjectLinkableMaybe mod loc ;
iface <- initIfaceCheck hsc_env $
loadUserInterface False (text "getLinkDeps2") mod ;
case mb_lnk of {
Nothing -> no_obj mod ;
Just lnk -> adjust_linkable iface lnk
Just lnk -> adjust_linkable lnk
}}
adjust_linkable iface lnk
-- Signatures have no linkables! Don't return one.
| mi_hsc_src iface == HsigFile = return Nothing
adjust_linkable lnk
| Just new_osuf <- replace_osuf = do
new_uls <- mapM (adjust_ul new_osuf)
(linkableUnlinked lnk)
return (Just lnk{ linkableUnlinked=new_uls })
return lnk{ linkableUnlinked=new_uls }
| otherwise =
return (Just lnk)
return lnk
adjust_ul new_osuf (DotO file) = do
MASSERT(osuf `isSuffixOf` file)
......
......@@ -298,17 +298,12 @@ loadSrcInterface_maybe doc mod want_boot maybe_pkg
-- interface; it will call the Finder again, but the ModLocation will be
-- cached from the first search.
= do { hsc_env <- getTopEnv
-- ToDo: findImportedModule should return a list of interfaces
; res <- liftIO $ findImportedModule hsc_env mod maybe_pkg
; case res of
FoundModule (FoundHs { fr_mod = mod })
-> fmap (fmap (:[]))
. initIfaceTcRn
$ loadInterface doc mod (ImportByUser want_boot)
FoundSigs mods _backing
-> initIfaceTcRn $ do
ms <- forM mods $ \(FoundHs { fr_mod = mod }) ->
loadInterface doc mod (ImportByUser want_boot)
return (sequence ms)
Found _ mod -> fmap (fmap (:[]))
. initIfaceTcRn
$ loadInterface doc mod (ImportByUser want_boot)
err -> return (Failed (cannotFindInterface (hsc_dflags hsc_env) mod err)) }
-- | Load interface directly for a fully qualified 'Module'. (This is a fairly
......@@ -746,7 +741,7 @@ findAndReadIface doc_str mod hi_boot_file
hsc_env <- getTopEnv
mb_found <- liftIO (findExactModule hsc_env mod)
case mb_found of
FoundExact loc mod -> do
Found loc mod -> do
-- Found file, so read it
let file_path = addBootSuffix_maybe hi_boot_file
......@@ -763,8 +758,7 @@ findAndReadIface doc_str mod hi_boot_file
traceIf (ptext (sLit "...not found"))
dflags <- getDynFlags
return (Failed (cannotFindInterface dflags
(moduleName mod)
(convFindExactResult err)))
(moduleName mod) err))
where read_file file_path = do
traceIf (ptext (sLit "readIFace") <+> text file_path)
read_result <- readIface mod file_path
......
......@@ -1334,20 +1334,9 @@ checkDependencies hsc_env summary iface
find_res <- liftIO $ findImportedModule hsc_env mod (fmap sl_fs pkg)
let reason = moduleNameString mod ++ " changed"
case find_res of
FoundModule h -> check_mod reason (fr_mod h)
FoundSigs hs _backing -> check_mods reason (map fr_mod hs)
_otherwise -> return (RecompBecause reason)
check_mods _ [] = return UpToDate
check_mods reason (m:ms) = do
r <- check_mod reason m
case r of
UpToDate -> check_mods reason ms
_otherwise -> return r
check_mod reason mod
Found _ mod
| pkg == this_pkg
= if moduleName mod `notElem` map fst prev_dep_mods
-> if moduleName mod `notElem` map fst prev_dep_mods
then do traceHiDiffs $
text "imported module " <> quotes (ppr mod) <>
text " not among previous dependencies"
......@@ -1355,7 +1344,7 @@ checkDependencies hsc_env summary iface
else
return UpToDate
| otherwise
= if pkg `notElem` (map fst prev_dep_pkgs)
-> if pkg `notElem` (map fst prev_dep_pkgs)
then do traceHiDiffs $
text "imported module " <> quotes (ppr mod) <>
text " is from package " <> quotes (ppr pkg) <>
......@@ -1364,6 +1353,7 @@ checkDependencies hsc_env summary iface
else
return UpToDate
where pkg = modulePackageKey mod
_otherwise -> return (RecompBecause reason)
needInterface :: Module -> (ModIface -> IfG RecompileRequired)
-> IfG RecompileRequired
......
......@@ -249,7 +249,7 @@ findDependency hsc_env srcloc pkg imp is_boot include_pkg_deps
-- we've done it once during downsweep
r <- findImportedModule hsc_env imp pkg
; case r of
FoundModule (FoundHs { fr_loc = loc })
Found loc _
-- Home package: just depend on the .hi or hi-boot file
| isJust (ml_hs_file loc) || include_pkg_deps
-> return (Just (addBootSuffix_maybe is_boot (ml_hi_file loc)))
......@@ -258,9 +258,6 @@ findDependency hsc_env srcloc pkg imp is_boot include_pkg_deps
| otherwise
-> return Nothing
-- TODO: FoundSignature. For now, we assume home package
-- "signature" dependencies look like FoundModule.
fail ->
let dflags = hsc_dflags hsc_env
in throwOneError $ mkPlainErrMsg dflags srcloc $
......
......@@ -203,15 +203,7 @@ lookupRdrNameInModuleForPlugins hsc_env mod_name rdr_name = do
-- First find the package the module resides in by searching exposed packages and home modules
found_module <- findImportedModule hsc_env mod_name Nothing
case found_module of
FoundModule h -> check_mod (fr_mod h)
FoundSigs hs _backing -> check_mods (map fr_mod hs) -- (not tested)
err -> throwCmdLineErrorS dflags $ cannotFindModule dflags mod_name err
where
dflags = hsc_dflags hsc_env
meth = "lookupRdrNameInModule"
doc = ptext (sLit $ "contains a name used in an invocation of " ++ meth)
check_mod mod = do
Found _ mod -> do
-- Find the exports of the module
(_, mb_iface) <- initTcInteractive hsc_env $
initIfaceTcRn $
......@@ -229,13 +221,10 @@ lookupRdrNameInModuleForPlugins hsc_env mod_name rdr_name = do
_ -> panic "lookupRdrNameInModule"
Nothing -> throwCmdLineErrorS dflags $ hsep [ptext (sLit "Could not determine the exports of the module"), ppr mod_name]
check_mods [] = return Nothing
check_mods (m:ms) = do
r <- check_mod m
case r of
Nothing -> check_mods ms
Just _ -> return r
err -> throwCmdLineErrorS dflags $ cannotFindModule dflags mod_name err
where
dflags = hsc_dflags hsc_env
doc = ptext (sLit "contains a name used in an invocation of lookupRdrNameInModule")
wrongTyThingError :: Name -> TyThing -> SDoc
wrongTyThingError name got_thing = hsep [ptext (sLit "The name"), ppr name, ptext (sLit "is not that of a value but rather a"), pprTyThingCategory got_thing]
......
......@@ -9,7 +9,6 @@
module Finder (
flushFinderCaches,
FindResult(..),
convFindExactResult, -- move to HscTypes?
findImportedModule,
findExactModule,
findHomeModule,
......@@ -46,7 +45,8 @@ import System.Directory
import System.FilePath
import Control.Monad
import Data.Time
import Data.List ( foldl', partition )
import Data.List ( foldl' )
type FileExt = String -- Filename extension
type BaseName = String -- Basename of file
......@@ -75,7 +75,7 @@ flushFinderCaches hsc_env =
is_ext mod _ | modulePackageKey mod /= this_pkg = True
| otherwise = False
addToFinderCache :: IORef FinderCache -> Module -> FindExactResult -> IO ()
addToFinderCache :: IORef FinderCache -> Module -> FindResult -> IO ()
addToFinderCache ref key val =
atomicModifyIORef' ref $ \c -> (extendModuleEnv c key val, ())
......@@ -83,7 +83,7 @@ removeFromFinderCache :: IORef FinderCache -> Module -> IO ()
removeFromFinderCache ref key =
atomicModifyIORef' ref $ \c -> (delModuleEnv c key, ())
lookupFinderCache :: IORef FinderCache -> Module -> IO (Maybe FindExactResult)
lookupFinderCache :: IORef FinderCache -> Module -> IO (Maybe FindResult)
lookupFinderCache ref key = do
c <- readIORef ref
return $! lookupModuleEnv c key
......@@ -104,7 +104,7 @@ findImportedModule hsc_env mod_name mb_pkg =
Just pkg | pkg == fsLit "this" -> home_import -- "this" is special
| otherwise -> pkg_import
where
home_import = convFindExactResult `fmap` findHomeModule hsc_env mod_name
home_import = findHomeModule hsc_env mod_name
pkg_import = findExposedPackageModule hsc_env mod_name mb_pkg
......@@ -118,7 +118,7 @@ findImportedModule hsc_env mod_name mb_pkg =
-- reading the interface for a module mentioned by another interface,
-- for example (a "system import").
findExactModule :: HscEnv -> Module -> IO FindExactResult
findExactModule :: HscEnv -> Module -> IO FindResult
findExactModule hsc_env mod =
let dflags = hsc_dflags hsc_env
in if modulePackageKey mod == thisPackage dflags
......@@ -152,45 +152,17 @@ orIfNotFound this or_this = do
-- been done. Otherwise, do the lookup (with the IO action) and save
-- the result in the finder cache and the module location cache (if it
-- was successful.)
homeSearchCache :: HscEnv
-> ModuleName
-> IO FindExactResult
-> IO FindExactResult
homeSearchCache :: HscEnv -> ModuleName -> IO FindResult -> IO FindResult
homeSearchCache hsc_env mod_name do_this = do
let mod = mkModule (thisPackage (hsc_dflags hsc_env)) mod_name
modLocationCache hsc_env mod do_this
-- | Converts a 'FindExactResult' into a 'FindResult' in the obvious way.
convFindExactResult :: FindExactResult -> FindResult
convFindExactResult (FoundExact loc m) = FoundModule (FoundHs loc m)
convFindExactResult (NoPackageExact pk) = NoPackage pk
convFindExactResult NotFoundExact { fer_paths = paths, fer_pkg = pkg } =
NotFound {
fr_paths = paths, fr_pkg = pkg,
fr_pkgs_hidden = [], fr_mods_hidden = [], fr_suggestions = []
}
foundExact :: FindExactResult -> Bool
foundExact FoundExact{} = True
foundExact _ = False
findExposedPackageModule :: HscEnv -> ModuleName -> Maybe FastString
-> IO FindResult
findExposedPackageModule hsc_env mod_name mb_pkg
= case lookupModuleWithSuggestions (hsc_dflags hsc_env) mod_name mb_pkg of
LookupFound (m, _) -> do
fmap convFindExactResult (findPackageModule hsc_env m)
LookupFoundSigs ms backing -> do
locs <- mapM (findPackageModule hsc_env . fst) ms
let (ok, missing) = partition foundExact locs
case missing of
-- At the moment, we return the errors one at a time. It might be
-- better if we collected them up and reported them all, but
-- FindResult doesn't have enough information to support this.
-- In any case, this REALLY shouldn't happen (it means there are
-- broken packages in the database.)
(m:_) -> return (convFindExactResult m)
_ -> return (FoundSigs [FoundHs l m | FoundExact l m <- ok] backing)
LookupFound m pkg_conf ->
findPackageModule_ hsc_env m pkg_conf
LookupMultiple rs ->
return (FoundMultiple rs)
LookupHidden pkg_hiddens mod_hiddens ->
......@@ -204,7 +176,7 @@ findExposedPackageModule hsc_env mod_name mb_pkg
, fr_mods_hidden = []
, fr_suggestions = suggest })
modLocationCache :: HscEnv -> Module -> IO FindExactResult -> IO FindExactResult
modLocationCache :: HscEnv -> Module -> IO FindResult -> IO FindResult
modLocationCache hsc_env mod do_this = do
m <- lookupFinderCache (hsc_FC hsc_env) mod
case m of
......@@ -217,7 +189,7 @@ modLocationCache hsc_env mod do_this = do
addHomeModuleToFinder :: HscEnv -> ModuleName -> ModLocation -> IO Module
addHomeModuleToFinder hsc_env mod_name loc = do
let mod = mkModule (thisPackage (hsc_dflags hsc_env)) mod_name
addToFinderCache (hsc_FC hsc_env) mod (FoundExact loc mod)
addToFinderCache (hsc_FC hsc_env) mod (Found loc mod)
return mod
uncacheModule :: HscEnv -> ModuleName -> IO ()
......@@ -244,7 +216,7 @@ uncacheModule hsc_env mod = do
--
-- 4. Some special-case code in GHCi (ToDo: Figure out why that needs to
-- call this.)
findHomeModule :: HscEnv -> ModuleName -> IO FindExactResult
findHomeModule :: HscEnv -> ModuleName -> IO FindResult
findHomeModule hsc_env mod_name =
homeSearchCache hsc_env mod_name $
let
......@@ -275,19 +247,19 @@ findHomeModule hsc_env mod_name =
-- This is important only when compiling the base package (where GHC.Prim
-- is a home module).
if mod == gHC_PRIM
then return (FoundExact (error "GHC.Prim ModLocation") mod)
then return (Found (error "GHC.Prim ModLocation") mod)
else searchPathExts home_path mod exts
-- | Search for a module in external packages only.
findPackageModule :: HscEnv -> Module -> IO FindExactResult
findPackageModule :: HscEnv -> Module -> IO FindResult
findPackageModule hsc_env mod = do
let
dflags = hsc_dflags hsc_env
pkg_id = modulePackageKey mod
--
case lookupPackage dflags pkg_id of
Nothing -> return (NoPackageExact pkg_id)
Nothing -> return (NoPackage pkg_id)
Just pkg_conf -> findPackageModule_ hsc_env mod pkg_conf
-- | Look up the interface file associated with module @mod@. This function
......@@ -297,14 +269,14 @@ findPackageModule hsc_env mod = do
-- the 'PackageConfig' must be consistent with the package key in the 'Module'.
-- The redundancy is to avoid an extra lookup in the package state
-- for the appropriate config.
findPackageModule_ :: HscEnv -> Module -> PackageConfig -> IO FindExactResult
findPackageModule_ :: HscEnv -> Module -> PackageConfig -> IO FindResult
findPackageModule_ hsc_env mod pkg_conf =
ASSERT( modulePackageKey mod == packageConfigId pkg_conf )
modLocationCache hsc_env mod $
-- special case for GHC.Prim; we won't find it in the filesystem.
if mod == gHC_PRIM
then return (FoundExact (error "GHC.Prim ModLocation") mod)
then return (Found (error "GHC.Prim ModLocation") mod)
else
let
......@@ -327,7 +299,7 @@ findPackageModule_ hsc_env mod pkg_conf =
-- don't bother looking for it.
let basename = moduleNameSlashes (moduleName mod)
loc <- mk_hi_loc one basename
return (FoundExact loc mod)
return (Found loc mod)
_otherwise ->
searchPathExts import_dirs mod [(package_hisuf, mk_hi_loc)]
......@@ -342,7 +314,7 @@ searchPathExts
FilePath -> BaseName -> IO ModLocation -- action
)
]
-> IO FindExactResult
-> IO FindResult
searchPathExts paths mod exts
= do result <- search to_search
......@@ -368,13 +340,15 @@ searchPathExts paths mod exts
file = base <.> ext
]
search [] = return (NotFoundExact {fer_paths = map fst to_search
,fer_pkg = Just (modulePackageKey mod)})
search [] = return (NotFound { fr_paths = map fst to_search
, fr_pkg = Just (modulePackageKey mod)
, fr_mods_hidden = [], fr_pkgs_hidden = []
, fr_suggestions = [] })
search ((file, mk_result) : rest) = do
b <- doesFileExist file
if b
then do { loc <- mk_result; return (FoundExact loc mod) }
then do { loc <- mk_result; return (Found loc mod) }
else search rest
mkHomeModLocationSearched :: DynFlags -> ModuleName -> FileExt
......@@ -597,8 +571,7 @@ cantFindErr cannot_find _ dflags mod_name find_result
vcat (map mod_hidden mod_hiddens) $$
tried_these files
_ -> pprPanic "cantFindErr"
(ptext cannot_find <+> quotes (ppr mod_name))
_ -> panic "cantFindErr"
build_tag = buildTag dflags
......
......@@ -1361,20 +1361,6 @@ showRichTokenStream ts = go startLoc ts ""
-- | Takes a 'ModuleName' and possibly a 'PackageKey', and consults the
-- filesystem and package database to find the corresponding 'Module',
-- using the algorithm that is used for an @import@ declaration.
--
-- However, there is a twist for local modules, see #2682.
--
-- The full algorithm:
-- IF it's a package qualified import for a REMOTE package (not @this_pkg@ or
-- this), do a normal lookup.
-- OTHERWISE see if it is ALREADY loaded, and use it if it is.
-- OTHERWISE do a normal lookup, but reject the result if the found result
-- is from the LOCAL package (@this_pkg@).
--
-- For signatures, we return the BACKING implementation to keep the API
-- consistent with what we had before. (ToDo: create a new GHC API which
-- can deal with signatures.)
--
findModule :: GhcMonad m => ModuleName -> Maybe FastString -> m Module
findModule mod_name maybe_pkg = withSession $ \hsc_env -> do
let
......@@ -1385,23 +1371,17 @@ findModule mod_name maybe_pkg = withSession $ \hsc_env -> do
Just pkg | fsToPackageKey pkg /= this_pkg && pkg /= fsLit "this" -> liftIO $ do
res <- findImportedModule hsc_env mod_name maybe_pkg
case res of
FoundModule h -> return (fr_mod h)
FoundSigs _ backing -> return backing
Found _ m -> return m
err -> throwOneError $ noModError dflags noSrcSpan mod_name err
_otherwise -> do
home <- lookupLoadedHomeModule mod_name
case home of
-- TODO: This COULD be a signature
Just m -> return m
Nothing -> liftIO $ do
res <- findImportedModule hsc_env mod_name maybe_pkg
case res of
FoundModule (FoundHs { fr_mod = m, fr_loc = loc })
| modulePackageKey m /= this_pkg -> return m
| otherwise -> modNotLoadedError dflags m loc
FoundSigs (FoundHs { fr_loc = loc, fr_mod = m }:_) backing
| modulePackageKey m /= this_pkg -> return backing
| otherwise -> modNotLoadedError dflags m loc
Found loc m | modulePackageKey m /= this_pkg -> return m
| otherwise -> modNotLoadedError dflags m loc
err -> throwOneError $ noModError dflags noSrcSpan mod_name err
modNotLoadedError :: DynFlags -> Module -> ModLocation -> IO a
......@@ -1422,13 +1402,11 @@ lookupModule mod_name (Just pkg) = findModule mod_name (Just pkg)
lookupModule mod_name Nothing = withSession $ \hsc_env -> do
home <- lookupLoadedHomeModule mod_name
case home of
-- TODO: This COULD be a signature
Just m -> return m
Nothing -> liftIO $ do
res <- findExposedPackageModule hsc_env mod_name Nothing
case res of
FoundModule (FoundHs { fr_mod = m }) -> return m
FoundSigs _ backing -> return backing
Found _ m -> return m
err -> throwOneError $ noModError (hsc_dflags hsc_env) noSrcSpan mod_name err
lookupLoadedHomeModule :: GhcMonad m => ModuleName -> m (Maybe Module)
......
......@@ -1818,10 +1818,7 @@ findSummaryBySourceFile summaries file
[] -> Nothing
(x:_) -> Just x
-- | Summarise a module, and pick up source and timestamp.
-- Returns @Nothing@ if the module is excluded via @excl_mods@ or is an
-- external package module (which we don't compile), otherwise returns the
-- new module summary (or an error saying why we couldn't summarise it).
-- Summarise a module, and pick up source and timestamp.
summariseModule
:: HscEnv
-> NodeMap ModSummary -- Map of old summaries
......@@ -1883,10 +1880,7 @@ summariseModule hsc_env old_summary_map is_boot (L loc wanted_mod)
uncacheModule hsc_env wanted_mod
found <- findImportedModule hsc_env wanted_mod Nothing
case found of
-- TODO: When we add -alias support, we can validly find
-- multiple signatures in the home package; need to make this
-- logic more flexible in that case.
FoundModule (FoundHs { fr_loc = location, fr_mod = mod })
Found location mod
| isJust (ml_hs_file location) ->
-- Home package
just_found location mod
......@@ -1895,15 +1889,6 @@ summariseModule hsc_env old_summary_map is_boot (L loc wanted_mod)
ASSERT(modulePackageKey mod /= thisPackage dflags)
return Nothing
FoundSigs hs _backing
| Just (FoundHs { fr_loc = location, fr_mod = mod })
<- find (isJust . ml_hs_file . fr_loc) hs ->
just_found location mod
| otherwise ->
ASSERT(all (\h -> modulePackageKey (fr_mod h)
/= thisPackage dflags) hs)
return Nothing
err -> return $ Just $ Left $ noModError dflags loc wanted_mod err
-- Not found
......
......@@ -10,7 +10,7 @@
module HscTypes (
-- * compilation state
HscEnv(..), hscEPS,
FinderCache, FindResult(..), FoundHs(..), FindExactResult(..),
FinderCache, FindResult(..),
Target(..), TargetId(..), pprTarget, pprTargetId,
ModuleGraph, emptyMG,
HscStatus(..),
......@@ -674,30 +674,15 @@ prepareAnnotations hsc_env mb_guts = do
-- modules along the search path. On @:load@, we flush the entire
-- contents of this cache.
--
type FinderCache = ModuleEnv FindExactResult
-- | The result of search for an exact 'Module'.
data FindExactResult
= FoundExact ModLocation Module
-- ^ The module/signature was found
| NoPackageExact PackageKey
| NotFoundExact
{ fer_paths :: [FilePath]
, fer_pkg :: Maybe PackageKey
}
-- | A found module or signature; e.g. anything with an interface file
data FoundHs = FoundHs { fr_loc :: ModLocation
, fr_mod :: Module
-- , fr_origin :: ModuleOrigin
}
-- Although the @FinderCache@ range is 'FindResult' for convenience,
-- in fact it will only ever contain 'Found' or 'NotFound' entries.
--
type FinderCache = ModuleEnv FindResult
-- | The result of searching for an imported module.
data FindResult
= FoundModule FoundHs
= Found ModLocation Module
-- ^ The module was found
| FoundSigs [FoundHs] Module
-- ^ Signatures were found, with some backing implementation
| NoPackage PackageKey
-- ^ The requested package was not found
| FoundMultiple [(Module, ModuleOrigin)]
......@@ -2093,15 +2078,6 @@ type IsBootInterface = Bool
-- Invariant: the dependencies of a module @M@ never includes @M@.
--
-- Invariant: none of the lists contain duplicates.
--
-- NB: While this contains information about all modules and packages below
-- this one in the the import *hierarchy*, this may not accurately reflect
-- the full runtime dependencies of the module. This is because this module may
-- have imported a boot module, in which case we'll only have recorded the
-- dependencies from the hs-boot file, not the actual hs file. (This is
-- unavoidable: usually, the actual hs file will have been compiled *after*
-- we wrote this interface file.) See #936, and also @getLinkDeps@ in
-- @compiler/ghci/Linker.hs@ for code which cares about this distinction.
data Dependencies
= Deps { dep_mods :: [(ModuleName, IsBootInterface)]
-- ^ All home-package modules transitively below this one
......
This diff is collapsed.
......@@ -970,11 +970,6 @@ ghc -c A.hs
written in a subset of Haskell essentially identical to that of
<literal>hs-boot</literal> files.</para>
<para>Signatures can be installed like ordinary module files,
and when multiple signatures are brought into scope under the same
module name, they are merged together if their backing implementations
are the same.</para>
<para>There is one important gotcha with the current implementation:
currently, instances from backing implementations will "leak" code that
uses signatures, and explicit instance declarations in signatures are
......
......@@ -847,12 +847,11 @@ abiHash strs = do
let modname = mkModuleName str
r <- findImportedModule hsc_env modname Nothing
case r of
FoundModule h -> return [fr_mod h]
FoundSigs hs _ -> return (map fr_mod hs)
Found _ m -> return m
_error -> throwGhcException $ CmdLineError $ showSDoc dflags $
cannotFindInterface dflags modname r
mods <- fmap concat (mapM find_it strs)
mods <- mapM find_it strs
let get_iface modl = loadUserInterface False (text "abiHash") modl
ifaces <- initIfaceCheck hsc_env $ mapM get_iface mods
......
......@@ -118,12 +118,6 @@ mk/ghcconfig*_bin_ghc*.exe.mk
/tests/cabal/sigcabal01/p_lazy
/tests/cabal/sigcabal01/p_strict
/tests/cabal/sigcabal01/containers
/tests/cabal/sigcabal02/Main
/tests/cabal/sigcabal02/p_ipid
/tests/cabal/sigcabal02/q_ipid
/tests/cabal/sigcabal02/containers
/tests/cabal/sigcabal02/tmp*
/tests/cabal/sigcabal02/inst*
/tests/cabal/local01.package.conf/
/tests/cabal/local03.package.conf/
/tests/cabal/local04.package.conf/
......
import Map
import P
import Q
main = do
x <- foo
print (mymember 5 x)
TOP=../../..
include $(TOP)/mk/boilerplate.mk
include $(TOP)/mk/test.mk
SETUP=../Setup -v0
# This test is for two Cabal packages exposing the same signature
sigcabal02:
$(MAKE) clean
'$(GHC_PKG)' field containers id | sed 's/^.*: *//' > containers
'$(GHC_PKG)' init tmp.d
'$(TEST_HC)' -v0 --make Setup
cd p && $(SETUP) clean
cd p && $(SETUP) configure $(CABAL_MINIMAL_BUILD) --with-ghc='$(TEST_HC)' --ghc-options='$(TEST_HC_OPTS)' --package-db=../tmp.d --prefix='$(PWD)/inst-p' --instantiate-with="Map=Data.Map.Lazy@`cat ../containers`" --instantiate-with="Set=Data.Set@`cat ../containers`" --ghc-pkg-options="--enable-multi-instance"
cd p && $(SETUP) build
cd p && $(SETUP) copy
cd p && $(SETUP) register --print-ipid > ../p_ipid
cd q && $(SETUP) clean
cd q && $(SETUP) configure $(CABAL_MINIMAL_BUILD) --with-ghc='$(TEST_HC)' --ghc-options='$(TEST_HC_OPTS)' --package-db=../tmp.d --prefix='$(PWD)/inst-p' --instantiate-with="Map=Data.Map.Lazy@`cat ../containers`" --ghc-pkg-options="--enable-multi-instance"
cd q && $(SETUP) build
cd q && $(SETUP) copy
cd q && $(SETUP) register --print-ipid > ../q_ipid
'$(TEST_HC)' $(TEST_HC_OPTS) -package-db=tmp.d -hide-all-packages -package base -package containers -package-id "`cat p_ipid`" -package-id "`cat q_ipid`" --make Main.hs
./Main
! '$(TEST_HC)' $(TEST_HC_OPTS) -package-db=tmp.d -hide-all-packages -package base -package containers -package-id "`cat p_ipid`" -package-id "`cat q_ipid`" --make ShouldFail.hs
ifneq "$(CLEANUP)" ""
$(MAKE) clean
endif
clean :
'$(GHC_PKG)' unregister --force p >/dev/null 2>&1 || true
'$(GHC_PKG)' unregister --force q >/dev/null 2>&1 || true
$(RM) -r tmp.d inst-* *.o *.hi */*.o */*.hi */Setup$(exeext) */dist Setup$(exeext)