diff options
author | Matthew Pickering <matthew.pickering@tweag.io> | 2018-05-27 11:57:27 -0400 |
---|---|---|
committer | Ben Gamari <ben@smart-cactus.org> | 2018-05-30 18:06:33 -0400 |
commit | 1d1e2b77fdc2babdf4fff72b9120c6831e7b422f (patch) | |
tree | 088af3cf628ef34181ec90434d55d5f1b05ead41 /compiler/deSugar/DsUsage.hs | |
parent | e0b44e2eccd4053852b6c4c3de75a714301ec080 (diff) | |
download | haskell-1d1e2b77fdc2babdf4fff72b9120c6831e7b422f.tar.gz |
Implement "An API for deciding whether plugins should cause recompilation"
This patch implements the API proposed as pull request #108 for plugin
authors to influence the recompilation checker.
It adds a new field to a plugin which computes a `FingerPrint`. This is
recorded in interface files and if it changes then we recompile the
module. There are also helper functions such as `purePlugin` and
`impurePlugin` for constructing plugins which have simple recompilation
semantics but in general, an author can compute a hash as they wish.
Fixes #12567 and #7414
https://github.com/ghc-proposals/ghc-proposals/blob/master/proposals/002
2-plugin-recompilation.rst
Reviewers: bgamari, ggreif
Reviewed By: bgamari
Subscribers: rwbarton, thomie, carter
GHC Trac Issues: #7414, #12567
Differential Revision: https://phabricator.haskell.org/D4366
Diffstat (limited to 'compiler/deSugar/DsUsage.hs')
-rw-r--r-- | compiler/deSugar/DsUsage.hs | 21 |
1 files changed, 15 insertions, 6 deletions
diff --git a/compiler/deSugar/DsUsage.hs b/compiler/deSugar/DsUsage.hs index 2eebca818f..c8a04247cc 100644 --- a/compiler/deSugar/DsUsage.hs +++ b/compiler/deSugar/DsUsage.hs @@ -1,4 +1,5 @@ {-# LANGUAGE CPP #-} +{-# LANGUAGE TupleSections #-} module DsUsage ( -- * Dependency/fingerprinting code (used by MkIface) @@ -49,17 +50,23 @@ its dep_orphs. This was the cause of Trac #14128. -- | Extract information from the rename and typecheck phases to produce -- a dependencies information for the module being compiled. -mkDependencies :: TcGblEnv -> IO Dependencies -mkDependencies - TcGblEnv{ tcg_mod = mod, +-- +-- The first argument is additional dependencies from plugins +mkDependencies :: InstalledUnitId -> [Module] -> TcGblEnv -> IO Dependencies +mkDependencies iuid pluginModules + (TcGblEnv{ tcg_mod = mod, tcg_imports = imports, tcg_th_used = th_var - } + }) = do -- Template Haskell used? + let (mns, ms) = unzip [ (moduleName mn, mn) | mn <- pluginModules ] + plugin_dep_mods = map (,False) mns + plugin_dep_pkgs = filter (/= iuid) (map (toInstalledUnitId . moduleUnitId) ms) th_used <- readIORef th_var let dep_mods = modDepsElts (delFromUFM (imp_dep_mods imports) (moduleName mod)) + ++ plugin_dep_mods -- M.hi-boot can be in the imp_dep_mods, but we must remove -- it before recording the modules on which this one depends! -- (We want to retain M.hi-boot in imp_dep_mods so that @@ -71,8 +78,10 @@ mkDependencies -- We must also remove self-references from imp_orphs. See -- Note [Module self-dependency] - pkgs | th_used = Set.insert (toInstalledUnitId thUnitId) (imp_dep_pkgs imports) - | otherwise = imp_dep_pkgs imports + raw_pkgs = foldr Set.insert (imp_dep_pkgs imports) plugin_dep_pkgs + + pkgs | th_used = Set.insert (toInstalledUnitId thUnitId) raw_pkgs + | otherwise = raw_pkgs -- Set the packages required to be Safe according to Safe Haskell. -- See Note [RnNames . Tracking Trust Transitively] |