PageRenderTime 49ms CodeModel.GetById 22ms RepoModel.GetById 0ms app.codeStats 0ms

/compiler/GHC/Unit/Module/Env.hs

https://github.com/ghc/ghc
Haskell | 276 lines | 174 code | 64 blank | 38 comment | 0 complexity | 5dae5e83e55d2b95ea3e58f3c0b18029 MD5 | raw file
  1. -- | Module environment
  2. module GHC.Unit.Module.Env
  3. ( -- * Module mappings
  4. ModuleEnv
  5. , elemModuleEnv, extendModuleEnv, extendModuleEnvList
  6. , extendModuleEnvList_C, plusModuleEnv_C
  7. , delModuleEnvList, delModuleEnv, plusModuleEnv, lookupModuleEnv
  8. , lookupWithDefaultModuleEnv, mapModuleEnv, mkModuleEnv, emptyModuleEnv
  9. , partitionModuleEnv
  10. , moduleEnvKeys, moduleEnvElts, moduleEnvToList
  11. , unitModuleEnv, isEmptyModuleEnv
  12. , extendModuleEnvWith, filterModuleEnv
  13. -- * ModuleName mappings
  14. , ModuleNameEnv, DModuleNameEnv
  15. -- * Sets of Modules
  16. , ModuleSet
  17. , emptyModuleSet, mkModuleSet, moduleSetElts
  18. , extendModuleSet, extendModuleSetList, delModuleSet
  19. , elemModuleSet, intersectModuleSet, minusModuleSet, unionModuleSet
  20. , unitModuleSet, isEmptyModuleSet
  21. , unionManyModuleSets
  22. -- * InstalledModuleEnv
  23. , InstalledModuleEnv
  24. , emptyInstalledModuleEnv
  25. , lookupInstalledModuleEnv
  26. , extendInstalledModuleEnv
  27. , filterInstalledModuleEnv
  28. , delInstalledModuleEnv
  29. , mergeInstalledModuleEnv
  30. , plusInstalledModuleEnv
  31. , installedModuleEnvElts
  32. )
  33. where
  34. import GHC.Prelude
  35. import GHC.Unit.Module.Name (ModuleName)
  36. import GHC.Types.Unique
  37. import GHC.Types.Unique.FM
  38. import GHC.Types.Unique.DFM
  39. import GHC.Unit.Types
  40. import GHC.Utils.Misc
  41. import Data.List (sortBy, sort)
  42. import Data.Ord
  43. import Data.Coerce
  44. import Data.Map (Map)
  45. import Data.Set (Set)
  46. import qualified Data.Map as Map
  47. import qualified Data.Set as Set
  48. import qualified GHC.Data.FiniteMap as Map
  49. import GHC.Utils.Outputable
  50. -- | A map keyed off of 'Module's
  51. newtype ModuleEnv elt = ModuleEnv (Map NDModule elt)
  52. instance Outputable a => Outputable (ModuleEnv a) where
  53. ppr (ModuleEnv m) = ppr m
  54. {-
  55. Note [ModuleEnv performance and determinism]
  56. ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  57. To prevent accidental reintroduction of nondeterminism the Ord instance
  58. for Module was changed to not depend on Unique ordering and to use the
  59. lexicographic order. This is potentially expensive, but when measured
  60. there was no difference in performance.
  61. To be on the safe side and not pessimize ModuleEnv uses nondeterministic
  62. ordering on Module and normalizes by doing the lexicographic sort when
  63. turning the env to a list.
  64. See Note [Unique Determinism] for more information about the source of
  65. nondeterminismand and Note [Deterministic UniqFM] for explanation of why
  66. it matters for maps.
  67. -}
  68. newtype NDModule = NDModule { unNDModule :: Module }
  69. deriving Eq
  70. -- A wrapper for Module with faster nondeterministic Ord.
  71. -- Don't export, See [ModuleEnv performance and determinism]
  72. --
  73. instance Outputable NDModule where
  74. ppr (NDModule a) = ppr a
  75. instance Ord NDModule where
  76. compare (NDModule (Module p1 n1)) (NDModule (Module p2 n2)) =
  77. (getUnique p1 `nonDetCmpUnique` getUnique p2) `thenCmp`
  78. (getUnique n1 `nonDetCmpUnique` getUnique n2)
  79. filterModuleEnv :: (Module -> a -> Bool) -> ModuleEnv a -> ModuleEnv a
  80. filterModuleEnv f (ModuleEnv e) =
  81. ModuleEnv (Map.filterWithKey (f . unNDModule) e)
  82. elemModuleEnv :: Module -> ModuleEnv a -> Bool
  83. elemModuleEnv m (ModuleEnv e) = Map.member (NDModule m) e
  84. extendModuleEnv :: ModuleEnv a -> Module -> a -> ModuleEnv a
  85. extendModuleEnv (ModuleEnv e) m x = ModuleEnv (Map.insert (NDModule m) x e)
  86. extendModuleEnvWith :: (a -> a -> a) -> ModuleEnv a -> Module -> a
  87. -> ModuleEnv a
  88. extendModuleEnvWith f (ModuleEnv e) m x =
  89. ModuleEnv (Map.insertWith f (NDModule m) x e)
  90. extendModuleEnvList :: ModuleEnv a -> [(Module, a)] -> ModuleEnv a
  91. extendModuleEnvList (ModuleEnv e) xs =
  92. ModuleEnv (Map.insertList [(NDModule k, v) | (k,v) <- xs] e)
  93. extendModuleEnvList_C :: (a -> a -> a) -> ModuleEnv a -> [(Module, a)]
  94. -> ModuleEnv a
  95. extendModuleEnvList_C f (ModuleEnv e) xs =
  96. ModuleEnv (Map.insertListWith f [(NDModule k, v) | (k,v) <- xs] e)
  97. plusModuleEnv_C :: (a -> a -> a) -> ModuleEnv a -> ModuleEnv a -> ModuleEnv a
  98. plusModuleEnv_C f (ModuleEnv e1) (ModuleEnv e2) =
  99. ModuleEnv (Map.unionWith f e1 e2)
  100. delModuleEnvList :: ModuleEnv a -> [Module] -> ModuleEnv a
  101. delModuleEnvList (ModuleEnv e) ms =
  102. ModuleEnv (Map.deleteList (map NDModule ms) e)
  103. delModuleEnv :: ModuleEnv a -> Module -> ModuleEnv a
  104. delModuleEnv (ModuleEnv e) m = ModuleEnv (Map.delete (NDModule m) e)
  105. plusModuleEnv :: ModuleEnv a -> ModuleEnv a -> ModuleEnv a
  106. plusModuleEnv (ModuleEnv e1) (ModuleEnv e2) = ModuleEnv (Map.union e1 e2)
  107. lookupModuleEnv :: ModuleEnv a -> Module -> Maybe a
  108. lookupModuleEnv (ModuleEnv e) m = Map.lookup (NDModule m) e
  109. lookupWithDefaultModuleEnv :: ModuleEnv a -> a -> Module -> a
  110. lookupWithDefaultModuleEnv (ModuleEnv e) x m =
  111. Map.findWithDefault x (NDModule m) e
  112. mapModuleEnv :: (a -> b) -> ModuleEnv a -> ModuleEnv b
  113. mapModuleEnv f (ModuleEnv e) = ModuleEnv (Map.mapWithKey (\_ v -> f v) e)
  114. partitionModuleEnv :: (a -> Bool) -> ModuleEnv a -> (ModuleEnv a, ModuleEnv a)
  115. partitionModuleEnv f (ModuleEnv e) = (ModuleEnv a, ModuleEnv b)
  116. where
  117. (a,b) = Map.partition f e
  118. mkModuleEnv :: [(Module, a)] -> ModuleEnv a
  119. mkModuleEnv xs = ModuleEnv (Map.fromList [(NDModule k, v) | (k,v) <- xs])
  120. emptyModuleEnv :: ModuleEnv a
  121. emptyModuleEnv = ModuleEnv Map.empty
  122. moduleEnvKeys :: ModuleEnv a -> [Module]
  123. moduleEnvKeys (ModuleEnv e) = sort $ map unNDModule $ Map.keys e
  124. -- See Note [ModuleEnv performance and determinism]
  125. moduleEnvElts :: ModuleEnv a -> [a]
  126. moduleEnvElts e = map snd $ moduleEnvToList e
  127. -- See Note [ModuleEnv performance and determinism]
  128. moduleEnvToList :: ModuleEnv a -> [(Module, a)]
  129. moduleEnvToList (ModuleEnv e) =
  130. sortBy (comparing fst) [(m, v) | (NDModule m, v) <- Map.toList e]
  131. -- See Note [ModuleEnv performance and determinism]
  132. unitModuleEnv :: Module -> a -> ModuleEnv a
  133. unitModuleEnv m x = ModuleEnv (Map.singleton (NDModule m) x)
  134. isEmptyModuleEnv :: ModuleEnv a -> Bool
  135. isEmptyModuleEnv (ModuleEnv e) = Map.null e
  136. -- | A set of 'Module's
  137. type ModuleSet = Set NDModule
  138. mkModuleSet :: [Module] -> ModuleSet
  139. mkModuleSet = Set.fromList . coerce
  140. extendModuleSet :: ModuleSet -> Module -> ModuleSet
  141. extendModuleSet s m = Set.insert (NDModule m) s
  142. extendModuleSetList :: ModuleSet -> [Module] -> ModuleSet
  143. extendModuleSetList s ms = foldl' (coerce . flip Set.insert) s ms
  144. emptyModuleSet :: ModuleSet
  145. emptyModuleSet = Set.empty
  146. isEmptyModuleSet :: ModuleSet -> Bool
  147. isEmptyModuleSet = Set.null
  148. moduleSetElts :: ModuleSet -> [Module]
  149. moduleSetElts = sort . coerce . Set.toList
  150. elemModuleSet :: Module -> ModuleSet -> Bool
  151. elemModuleSet = Set.member . coerce
  152. intersectModuleSet :: ModuleSet -> ModuleSet -> ModuleSet
  153. intersectModuleSet = coerce Set.intersection
  154. minusModuleSet :: ModuleSet -> ModuleSet -> ModuleSet
  155. minusModuleSet = coerce Set.difference
  156. delModuleSet :: ModuleSet -> Module -> ModuleSet
  157. delModuleSet = coerce (flip Set.delete)
  158. unionModuleSet :: ModuleSet -> ModuleSet -> ModuleSet
  159. unionModuleSet = coerce Set.union
  160. unionManyModuleSets :: [ModuleSet] -> ModuleSet
  161. unionManyModuleSets = coerce (Set.unions :: [Set NDModule] -> Set NDModule)
  162. unitModuleSet :: Module -> ModuleSet
  163. unitModuleSet = coerce Set.singleton
  164. {-
  165. A ModuleName has a Unique, so we can build mappings of these using
  166. UniqFM.
  167. -}
  168. -- | A map keyed off of 'ModuleName's (actually, their 'Unique's)
  169. type ModuleNameEnv elt = UniqFM ModuleName elt
  170. -- | A map keyed off of 'ModuleName's (actually, their 'Unique's)
  171. -- Has deterministic folds and can be deterministically converted to a list
  172. type DModuleNameEnv elt = UniqDFM ModuleName elt
  173. --------------------------------------------------------------------
  174. -- InstalledModuleEnv
  175. --------------------------------------------------------------------
  176. -- | A map keyed off of 'InstalledModule'
  177. newtype InstalledModuleEnv elt = InstalledModuleEnv (Map InstalledModule elt)
  178. instance Outputable elt => Outputable (InstalledModuleEnv elt) where
  179. ppr (InstalledModuleEnv env) = ppr env
  180. emptyInstalledModuleEnv :: InstalledModuleEnv a
  181. emptyInstalledModuleEnv = InstalledModuleEnv Map.empty
  182. lookupInstalledModuleEnv :: InstalledModuleEnv a -> InstalledModule -> Maybe a
  183. lookupInstalledModuleEnv (InstalledModuleEnv e) m = Map.lookup m e
  184. extendInstalledModuleEnv :: InstalledModuleEnv a -> InstalledModule -> a -> InstalledModuleEnv a
  185. extendInstalledModuleEnv (InstalledModuleEnv e) m x = InstalledModuleEnv (Map.insert m x e)
  186. filterInstalledModuleEnv :: (InstalledModule -> a -> Bool) -> InstalledModuleEnv a -> InstalledModuleEnv a
  187. filterInstalledModuleEnv f (InstalledModuleEnv e) =
  188. InstalledModuleEnv (Map.filterWithKey f e)
  189. delInstalledModuleEnv :: InstalledModuleEnv a -> InstalledModule -> InstalledModuleEnv a
  190. delInstalledModuleEnv (InstalledModuleEnv e) m = InstalledModuleEnv (Map.delete m e)
  191. installedModuleEnvElts :: InstalledModuleEnv a -> [(InstalledModule, a)]
  192. installedModuleEnvElts (InstalledModuleEnv e) = Map.assocs e
  193. mergeInstalledModuleEnv
  194. :: (elta -> eltb -> Maybe eltc)
  195. -> (InstalledModuleEnv elta -> InstalledModuleEnv eltc) -- map X
  196. -> (InstalledModuleEnv eltb -> InstalledModuleEnv eltc) -- map Y
  197. -> InstalledModuleEnv elta
  198. -> InstalledModuleEnv eltb
  199. -> InstalledModuleEnv eltc
  200. mergeInstalledModuleEnv f g h (InstalledModuleEnv xm) (InstalledModuleEnv ym)
  201. = InstalledModuleEnv $ Map.mergeWithKey
  202. (\_ x y -> (x `f` y))
  203. (coerce g)
  204. (coerce h)
  205. xm ym
  206. plusInstalledModuleEnv :: (elt -> elt -> elt)
  207. -> InstalledModuleEnv elt
  208. -> InstalledModuleEnv elt
  209. -> InstalledModuleEnv elt
  210. plusInstalledModuleEnv f (InstalledModuleEnv xm) (InstalledModuleEnv ym) =
  211. InstalledModuleEnv $ Map.unionWith f xm ym