import FastString
import Util
import PrelNames ( gHC_PRIM )
-import DynFlags ( DynFlags(..), isOneShot, GhcMode(..) )
+import DynFlags
import Outputable
-import FiniteMap
import LazyUniqFM
import Maybes ( expectJust )
+import Exception ( evaluate )
+import Distribution.Text
import Distribution.Package hiding (PackageId)
-import Data.IORef ( IORef, writeIORef, readIORef, modifyIORef )
-import Data.List
+import Data.IORef ( IORef, writeIORef, readIORef, atomicModifyIORef )
import System.Directory
import System.FilePath
-import System.IO
import Control.Monad
import System.Time ( ClockTime )
-- assumed to not move around during a session.
flushFinderCaches :: HscEnv -> IO ()
flushFinderCaches hsc_env = do
+ -- Ideally the update to both caches be a single atomic operation.
writeIORef fc_ref emptyUFM
flushModLocationCache this_pkg mlc_ref
where
flushModLocationCache :: PackageId -> IORef ModLocationCache -> IO ()
flushModLocationCache this_pkg ref = do
- fm <- readIORef ref
- writeIORef ref $! filterFM is_ext fm
+ atomicModifyIORef ref $ \fm -> (filterModuleEnv is_ext fm, ())
+ _ <- evaluate =<< readIORef ref
return ()
where is_ext mod _ | modulePackageId mod /= this_pkg = True
| otherwise = False
addToFinderCache :: IORef FinderCache -> ModuleName -> FindResult -> IO ()
-addToFinderCache ref key val = modifyIORef ref $ \c -> addToUFM c key val
+addToFinderCache ref key val =
+ atomicModifyIORef ref $ \c -> (addToUFM c key val, ())
addToModLocationCache :: IORef ModLocationCache -> Module -> ModLocation -> IO ()
-addToModLocationCache ref key val = modifyIORef ref $ \c -> addToFM c key val
+addToModLocationCache ref key val =
+ atomicModifyIORef ref $ \c -> (extendModuleEnv c key val, ())
removeFromFinderCache :: IORef FinderCache -> ModuleName -> IO ()
-removeFromFinderCache ref key = modifyIORef ref $ \c -> delFromUFM c key
+removeFromFinderCache ref key =
+ atomicModifyIORef ref $ \c -> (delFromUFM c key, ())
removeFromModLocationCache :: IORef ModLocationCache -> Module -> IO ()
-removeFromModLocationCache ref key = modifyIORef ref $ \c -> delFromFM c key
+removeFromModLocationCache ref key =
+ atomicModifyIORef ref $ \c -> (delModuleEnv c key, ())
lookupFinderCache :: IORef FinderCache -> ModuleName -> IO (Maybe FindResult)
lookupFinderCache ref key = do
-> IO (Maybe ModLocation)
lookupModLocationCache ref key = do
c <- readIORef ref
- return $! lookupFM c key
+ return $! lookupModuleEnv c key
-- -----------------------------------------------------------------------------
-- The two external entry points
| null found_exposed = return (NotFound [] Nothing mod_hiddens pkg_hiddens)
-- found in just one exposed package:
| [(pkg_conf, _)] <- found_exposed
- = let pkgid = mkPackageId (package pkg_conf) in
+ = let pkgid = packageConfigId pkg_conf in
findPackageModule_ hsc_env (mkModule pkgid mod_name) pkg_conf
| otherwise
- = return (FoundMultiple (map (mkPackageId.package.fst) found_exposed))
+ = return (FoundMultiple (map (packageConfigId.fst) found_exposed))
where
dflags = hsc_dflags hsc_env
found = lookupModuleInAllPackages dflags mod_name
is_exposed (pkg_conf,exposed_mod) = exposed pkg_conf && exposed_mod
- mod_hiddens = [ mkPackageId (package pkg_conf)
+ mod_hiddens = [ packageConfigId pkg_conf
| (pkg_conf,False) <- found ]
- pkg_hiddens = [ mkPackageId (package pkg_conf)
+ pkg_hiddens = [ packageConfigId pkg_conf
| (pkg_conf,_) <- found, not (exposed pkg_conf) ]
_pkg_conf `matches` Nothing = True
hang (ptext (sLit "locations searched:")) 2 $ vcat (map text files)
pkg_hidden pkg =
- ptext (sLit "it is a member of the hidden package") <+> quotes (ppr pkg)
+ ptext (sLit "It is a member of the hidden package") <+> quotes (ppr pkg)
+ <> dot $$ cabal_pkg_hidden_hint pkg
+ cabal_pkg_hidden_hint pkg
+ | dopt Opt_BuildingCabalPackage dflags
+ = case simpleParse (packageIdString pkg) of
+ Just pid ->
+ ptext (sLit "Perhaps you need to add") <+>
+ quotes (text (display (pkgName pid))) <+>
+ ptext (sLit "to the build-depends in your .cabal file.")
+ Nothing -> empty
+ | otherwise = empty
mod_hidden pkg =
ptext (sLit "it is a hidden module in the package") <+> quotes (ppr pkg)