diff options
author | Matthew Pickering <matthewtpickering@gmail.com> | 2022-03-01 16:13:44 +0000 |
---|---|---|
committer | Marge Bot <ben+marge-bot@smart-cactus.org> | 2022-03-23 13:41:31 -0400 |
commit | 4dc624987a7e000e9e1086a601039afafb7f2d28 (patch) | |
tree | 982838d1ec69844598069ebb225bbf2bd28ffba1 /ghc | |
parent | b06e5dd8a2b258d5d6f3676c9f424cc09d4d73f3 (diff) | |
download | haskell-4dc624987a7e000e9e1086a601039afafb7f2d28.tar.gz |
Fix behaviour of -Wunused-packages in ghci
Ticket #21110 points out that -Wunused-packages behaves a bit unusually
in GHCi. Now we define the semantics for -Wunused-packages in
interactive mode as follows:
* If you use -Wunused-packages on an initial load then the warning is reported.
* If you explicitly set -Wunused-packages on the command line then the
warning is displayed (until it is disabled)
* If you then subsequently modify the set of available targets by using
:load or :cd (:cd unloads everything) then the warning is (silently)
turned off.
This means that every :r the warning is printed if it's turned on (but you did ask for it).
Fixes #21110
Diffstat (limited to 'ghc')
-rw-r--r-- | ghc/GHCi/UI.hs | 41 |
1 files changed, 30 insertions, 11 deletions
diff --git a/ghc/GHCi/UI.hs b/ghc/GHCi/UI.hs index 76d714c3e6..68519f5ce7 100644 --- a/ghc/GHCi/UI.hs +++ b/ghc/GHCi/UI.hs @@ -135,6 +135,8 @@ import Prelude hiding ((<>)) import GHC.Utils.Exception as Exception hiding (catch, mask, handle) import Foreign hiding (void) import GHC.Stack hiding (SrcLoc(..)) +import GHC.Unit.Env +import GHC.Unit.Home.ModInfo import System.Directory import System.Environment @@ -1655,8 +1657,8 @@ changeDirectory dir = do graph <- GHC.getModuleGraph when (not (null $ GHC.mgModSummaries graph)) $ liftIO $ putStrLn "Warning: changing directory causes all loaded modules to be unloaded,\nbecause the search path has changed." - -- delete targets and all eventually defined breakpoints (#1620) - clearAllTargets + -- delete defined breakpoints and clear the interface file cache (#1620) + clearCaches setContextAfterLoad False Nothing GHC.workingDirectoryChanged dir' <- expandPath dir @@ -2030,7 +2032,7 @@ loadModule' files = do let load_module = do -- unload first _ <- GHC.abandonAll - clearAllTargets + clearCaches GHC.setTargets targets doLoadAndCollectInfo False LoadAllTargets @@ -3150,8 +3152,8 @@ newDynFlags interactive_only minus_opts = do when (verbosity dflags2 > 0) $ liftIO . putStrLn $ "package flags have changed, resetting and loading new packages..." - -- delete targets and all eventually defined breakpoints. (#1620) - clearAllTargets + -- Clear caches and eventually defined breakpoints. (#1620) + clearCaches when must_reload $ do let units = preloadUnits (hsc_units hsc_env) liftIO $ Loader.loadPackages interp hsc_env units @@ -4446,6 +4448,22 @@ discardInterfaceCache :: GhciMonad m => m () discardInterfaceCache = do modifyGHCiState $ (\st -> st { hmiCache = [] }) +clearHPTs :: GhciMonad m => m () +clearHPTs = do + let pruneHomeUnitEnv hme = hme { homeUnitEnv_hpt = emptyHomePackageTable } + discardMG hsc = hsc { hsc_mod_graph = GHC.emptyMG } + modifySession (discardMG . discardIC . hscUpdateHUG (unitEnv_map pruneHomeUnitEnv)) + + +-- The unused package warning doesn't make sense once the targets get out of +-- sync with the package flags. See #21110 +-- Therefore if it's turned on, the warnings are issued until the module context +-- changes (via :load or :cd), at which stage the package flags are not going to change +-- but the loaded modules will probably not use all the specified packages so the +-- warning becomes spurious. At that point the warning is silently disabled. +disableUnusedPackages :: GhciMonad m => m () +disableUnusedPackages = newDynFlags False ["-Wno-unused-packages"] + deleteBreak :: GhciMonad m => Int -> m () deleteBreak identity = do st <- getGHCiState @@ -4636,12 +4654,13 @@ wantNameFromInterpretedModule noCanDo str and_then = text " is not interpreted" else and_then n -clearAllTargets :: GhciMonad m => m () -clearAllTargets = discardActiveBreakPoints - >> discardInterfaceCache - >> GHC.setTargets [] - >> GHC.load LoadAllTargets - >> pure () +clearCaches :: GhciMonad m => m () +clearCaches = discardActiveBreakPoints + >> discardInterfaceCache + >> disableUnusedPackages + >> clearHPTs + + -- Split up a string with an eventually qualified declaration name into 3 components -- 1. module name |