summaryrefslogtreecommitdiff
path: root/ghc
diff options
context:
space:
mode:
authorDavid Terei <davidterei@gmail.com>2011-08-19 01:47:59 -0700
committerDavid Terei <davidterei@gmail.com>2011-08-19 01:47:59 -0700
commit5bbb5cf300073335828887a80deff0e4cfd757a8 (patch)
treed5a5d25abf0dfec75eeddad5931efae577334047 /ghc
parent548765e28739af5479e47e05bc4e6051cd709c66 (diff)
downloadhaskell-5bbb5cf300073335828887a80deff0e4cfd757a8.tar.gz
More info from :issafe ghci command
Diffstat (limited to 'ghc')
-rw-r--r--ghc/InteractiveUI.hs65
1 files changed, 41 insertions, 24 deletions
diff --git a/ghc/InteractiveUI.hs b/ghc/InteractiveUI.hs
index 6cdce2c506..169075ff16 100644
--- a/ghc/InteractiveUI.hs
+++ b/ghc/InteractiveUI.hs
@@ -34,7 +34,7 @@ import Packages
-- import PackageConfig
import UniqFM
-import HscTypes ( handleFlagWarnings, getSafeMode )
+import HscTypes ( handleFlagWarnings, getSafeMode, dep_pkgs )
import HsImpExp
import qualified RdrName ( getGRE_NameQualifier_maybes ) -- should this come via GHC?
import RdrName (RdrName)
@@ -1327,38 +1327,55 @@ runScript filename = do
isSafeCmd :: String -> InputT GHCi ()
isSafeCmd m =
- case words m of
- [s] | looksLikeModuleName s -> do
- m <- lift $ lookupModule s
- isSafeModule m
- [] -> do m <- guessCurrentModule
- isSafeModule m
- _ -> ghcError (CmdLineError "syntax: :issafe <module>")
+ case words m of
+ [s] | looksLikeModuleName s -> do
+ m <- lift $ lookupModule s
+ isSafeModule m
+ [] -> do m <- guessCurrentModule
+ isSafeModule m
+ _ -> ghcError (CmdLineError "syntax: :issafe <module>")
isSafeModule :: Module -> InputT GHCi ()
isSafeModule m = do
- mb_mod_info <- GHC.getModuleInfo m
- case mb_mod_info of
- Nothing -> ghcError $ CmdLineError ("unknown module: " ++
- GHC.moduleNameString (GHC.moduleName m))
- Just mi -> do
- dflags <- getDynFlags
- let iface = GHC.modInfoIface mi
- case iface of
- Just iface' -> do
- let trust = showPpr $ getSafeMode $ GHC.mi_trust iface'
- pkg = if packageTrusted dflags m then "trusted" else "untrusted"
- liftIO $ putStrLn $ "Trust type is (Module: " ++ trust
- ++ ", Package: " ++ pkg ++ ")"
- Nothing -> ghcError $ CmdLineError ("can't load interface file for module: " ++
- GHC.moduleNameString (GHC.moduleName m))
+ mb_mod_info <- GHC.getModuleInfo m
+ when (isNothing mb_mod_info)
+ (ghcError $ CmdLineError $ "unknown module: " ++ mname)
+
+ dflags <- getDynFlags
+ let iface = GHC.modInfoIface $ fromJust mb_mod_info
+ when (isNothing iface)
+ (ghcError $ CmdLineError $ "can't load interface file for module: " ++
+ (GHC.moduleNameString $ GHC.moduleName m))
+
+ let iface' = fromJust iface
+ trust = showPpr $ getSafeMode $ GHC.mi_trust iface'
+ pkg = if packageTrusted dflags m then "trusted" else "untrusted"
+ (good, bad) = tallyPkgs dflags $
+ map fst $ filter snd $ dep_pkgs $ GHC.mi_deps iface'
+
+ liftIO $ putStrLn $ "Trust type is (Module: " ++ trust ++ ", Package: " ++ pkg ++ ")"
+ when (not $ null good)
+ (liftIO $ putStrLn $ "Trusted package dependencies (trusted): " ++
+ (intercalate ", " $ map packageIdString good))
+ if (null bad)
+ then liftIO $ putStrLn $ mname ++ " is trusted!"
+ else do
+ liftIO $ putStrLn $ "Trusted package dependencies (untrusted): "
+ ++ (intercalate ", " $ map packageIdString bad)
+ liftIO $ putStrLn $ mname ++ " is NOT trusted!")
+
where
- packageTrusted :: DynFlags -> Module -> Bool
+ mname = GHC.moduleNameString $ GHC.moduleName m
+
packageTrusted dflags m
| thisPackage dflags == modulePackageId m = True
| otherwise = trusted $ getPackageDetails (pkgState dflags)
(modulePackageId m)
+ tallyPkgs dflags deps = partition part deps
+ where state = pkgState dflags
+ part pkg = trusted $ getPackageDetails state pkg
+
-----------------------------------------------------------------------------
-- Browsing a module's contents