PageRenderTime 53ms CodeModel.GetById 21ms RepoModel.GetById 0ms app.codeStats 0ms

/compiler/basicTypes/NameEnv.hs

http://github.com/ghc/ghc
Haskell | 151 lines | 89 code | 20 blank | 42 comment | 0 complexity | 79c8092833e05cfa987ffd01e097fd30 MD5 | raw file
Possible License(s): MIT, BSD-3-Clause, GPL-3.0
  1. {-
  2. (c) The University of Glasgow 2006
  3. (c) The GRASP/AQUA Project, Glasgow University, 1992-1998
  4. \section[NameEnv]{@NameEnv@: name environments}
  5. -}
  6. {-# LANGUAGE CPP #-}
  7. module NameEnv (
  8. -- * Var, Id and TyVar environments (maps)
  9. NameEnv,
  10. -- ** Manipulating these environments
  11. mkNameEnv,
  12. emptyNameEnv, isEmptyNameEnv,
  13. unitNameEnv, nameEnvElts,
  14. extendNameEnv_C, extendNameEnv_Acc, extendNameEnv,
  15. extendNameEnvList, extendNameEnvList_C,
  16. filterNameEnv, anyNameEnv,
  17. plusNameEnv, plusNameEnv_C, alterNameEnv,
  18. lookupNameEnv, lookupNameEnv_NF, delFromNameEnv, delListFromNameEnv,
  19. elemNameEnv, mapNameEnv, disjointNameEnv,
  20. DNameEnv,
  21. emptyDNameEnv,
  22. lookupDNameEnv,
  23. mapDNameEnv,
  24. alterDNameEnv,
  25. -- ** Dependency analysis
  26. depAnal
  27. ) where
  28. #include "HsVersions.h"
  29. import Digraph
  30. import Name
  31. import UniqFM
  32. import UniqDFM
  33. import Maybes
  34. {-
  35. ************************************************************************
  36. * *
  37. \subsection{Name environment}
  38. * *
  39. ************************************************************************
  40. -}
  41. {-
  42. Note [depAnal determinism]
  43. ~~~~~~~~~~~~~~~~~~~~~~~~~~
  44. depAnal is deterministic provided it gets the nodes in a deterministic order.
  45. The order of lists that get_defs and get_uses return doesn't matter, as these
  46. are only used to construct the edges, and stronglyConnCompFromEdgedVertices is
  47. deterministic even when the edges are not in deterministic order as explained
  48. in Note [Deterministic SCC] in Digraph.
  49. -}
  50. depAnal :: (node -> [Name]) -- Defs
  51. -> (node -> [Name]) -- Uses
  52. -> [node]
  53. -> [SCC node]
  54. -- Peform dependency analysis on a group of definitions,
  55. -- where each definition may define more than one Name
  56. --
  57. -- The get_defs and get_uses functions are called only once per node
  58. depAnal get_defs get_uses nodes
  59. = stronglyConnCompFromEdgedVerticesUniq (map mk_node keyed_nodes)
  60. where
  61. keyed_nodes = nodes `zip` [(1::Int)..]
  62. mk_node (node, key) = (node, key, mapMaybe (lookupNameEnv key_map) (get_uses node))
  63. key_map :: NameEnv Int -- Maps a Name to the key of the decl that defines it
  64. key_map = mkNameEnv [(name,key) | (node, key) <- keyed_nodes, name <- get_defs node]
  65. {-
  66. ************************************************************************
  67. * *
  68. \subsection{Name environment}
  69. * *
  70. ************************************************************************
  71. -}
  72. -- | Name Environment
  73. type NameEnv a = UniqFM a -- Domain is Name
  74. emptyNameEnv :: NameEnv a
  75. isEmptyNameEnv :: NameEnv a -> Bool
  76. mkNameEnv :: [(Name,a)] -> NameEnv a
  77. nameEnvElts :: NameEnv a -> [a]
  78. alterNameEnv :: (Maybe a-> Maybe a) -> NameEnv a -> Name -> NameEnv a
  79. extendNameEnv_C :: (a->a->a) -> NameEnv a -> Name -> a -> NameEnv a
  80. extendNameEnv_Acc :: (a->b->b) -> (a->b) -> NameEnv b -> Name -> a -> NameEnv b
  81. extendNameEnv :: NameEnv a -> Name -> a -> NameEnv a
  82. plusNameEnv :: NameEnv a -> NameEnv a -> NameEnv a
  83. plusNameEnv_C :: (a->a->a) -> NameEnv a -> NameEnv a -> NameEnv a
  84. extendNameEnvList :: NameEnv a -> [(Name,a)] -> NameEnv a
  85. extendNameEnvList_C :: (a->a->a) -> NameEnv a -> [(Name,a)] -> NameEnv a
  86. delFromNameEnv :: NameEnv a -> Name -> NameEnv a
  87. delListFromNameEnv :: NameEnv a -> [Name] -> NameEnv a
  88. elemNameEnv :: Name -> NameEnv a -> Bool
  89. unitNameEnv :: Name -> a -> NameEnv a
  90. lookupNameEnv :: NameEnv a -> Name -> Maybe a
  91. lookupNameEnv_NF :: NameEnv a -> Name -> a
  92. filterNameEnv :: (elt -> Bool) -> NameEnv elt -> NameEnv elt
  93. anyNameEnv :: (elt -> Bool) -> NameEnv elt -> Bool
  94. mapNameEnv :: (elt1 -> elt2) -> NameEnv elt1 -> NameEnv elt2
  95. disjointNameEnv :: NameEnv a -> NameEnv a -> Bool
  96. nameEnvElts x = eltsUFM x
  97. emptyNameEnv = emptyUFM
  98. isEmptyNameEnv = isNullUFM
  99. unitNameEnv x y = unitUFM x y
  100. extendNameEnv x y z = addToUFM x y z
  101. extendNameEnvList x l = addListToUFM x l
  102. lookupNameEnv x y = lookupUFM x y
  103. alterNameEnv = alterUFM
  104. mkNameEnv l = listToUFM l
  105. elemNameEnv x y = elemUFM x y
  106. plusNameEnv x y = plusUFM x y
  107. plusNameEnv_C f x y = plusUFM_C f x y
  108. extendNameEnv_C f x y z = addToUFM_C f x y z
  109. mapNameEnv f x = mapUFM f x
  110. extendNameEnv_Acc x y z a b = addToUFM_Acc x y z a b
  111. extendNameEnvList_C x y z = addListToUFM_C x y z
  112. delFromNameEnv x y = delFromUFM x y
  113. delListFromNameEnv x y = delListFromUFM x y
  114. filterNameEnv x y = filterUFM x y
  115. anyNameEnv f x = foldUFM ((||) . f) False x
  116. disjointNameEnv x y = isNullUFM (intersectUFM x y)
  117. lookupNameEnv_NF env n = expectJust "lookupNameEnv_NF" (lookupNameEnv env n)
  118. -- | Deterministic Name Environment
  119. --
  120. -- See Note [Deterministic UniqFM] in UniqDFM for explanation why we need
  121. -- DNameEnv.
  122. type DNameEnv a = UniqDFM a
  123. emptyDNameEnv :: DNameEnv a
  124. emptyDNameEnv = emptyUDFM
  125. lookupDNameEnv :: DNameEnv a -> Name -> Maybe a
  126. lookupDNameEnv = lookupUDFM
  127. mapDNameEnv :: (a -> b) -> DNameEnv a -> DNameEnv b
  128. mapDNameEnv = mapUDFM
  129. alterDNameEnv :: (Maybe a -> Maybe a) -> DNameEnv a -> Name -> DNameEnv a
  130. alterDNameEnv = alterUDFM