Add mapMG to allow making ModuleGraph abstract
authorBartosz Nitka <niteria@gmail.com>
Wed, 14 Jun 2017 15:51:43 +0000 (08:51 -0700)
committerBartosz Nitka <niteria@gmail.com>
Wed, 14 Jun 2017 15:52:02 +0000 (08:52 -0700)
Currently GHC exposes the internal details of `ModuleGraph`
which inhibits making `ModuleGraph` support faster lookups.

Haddock relies on the internal representation by using `map`
on `ModuleGraph`. See also
https://github.com/haskell/haddock/issues/635

Adding `mapMG` should allow us to make `ModuleGraph` abstract.

Test Plan: ./validate

Reviewers: simonmar, austin, bgamari, alexbiehl

Reviewed By: bgamari, alexbiehl

Subscribers: alexbiehl, rwbarton, thomie

Differential Revision: https://phabricator.haskell.org/D3645

compiler/main/GHC.hs
compiler/main/HscTypes.hs

index d58f3e9..2102009 100644 (file)
@@ -59,7 +59,8 @@ module GHC (
         compileToCoreModule, compileToCoreSimplified,
 
         -- * Inspecting the module structure of the program
-        ModuleGraph, ModSummary(..), ms_mod_name, ModLocation(..),
+        ModuleGraph, emptyMG, mapMG,
+        ModSummary(..), ms_mod_name, ModLocation(..),
         getModSummary,
         getModuleGraph,
         isLoaded,
@@ -630,7 +631,7 @@ setProgramDynFlags_ invalidate_needed dflags = do
 --
 invalidateModSummaryCache :: GhcMonad m => m ()
 invalidateModSummaryCache =
-  modifySession $ \h -> h { hsc_mod_graph = map inval (hsc_mod_graph h) }
+  modifySession $ \h -> h { hsc_mod_graph = mapMG inval (hsc_mod_graph h) }
  where
   inval ms = ms { ms_hs_date = addUTCTime (-1) (ms_hs_date ms) }
 
index 369a190..fa9c18a 100644 (file)
@@ -12,7 +12,7 @@ module HscTypes (
         HscEnv(..), hscEPS,
         FinderCache, FindResult(..), InstalledFindResult(..),
         Target(..), TargetId(..), pprTarget, pprTargetId,
-        ModuleGraph, emptyMG,
+        ModuleGraph, emptyMG, mapMG,
         HscStatus(..),
         IServ(..),
 
@@ -2611,6 +2611,9 @@ type ModuleGraph = [ModSummary]
 emptyMG :: ModuleGraph
 emptyMG = []
 
+mapMG :: (ModSummary -> ModSummary) -> ModuleGraph -> ModuleGraph
+mapMG = map
+
 -- | A single node in a 'ModuleGraph'. The nodes of the module graph
 -- are one of:
 --