summaryrefslogtreecommitdiff
path: root/compiler
diff options
context:
space:
mode:
Diffstat (limited to 'compiler')
-rw-r--r--compiler/basicTypes/NameSet.lhs127
1 files changed, 60 insertions, 67 deletions
diff --git a/compiler/basicTypes/NameSet.lhs b/compiler/basicTypes/NameSet.lhs
index 9cd9fcef93..f871d1e650 100644
--- a/compiler/basicTypes/NameSet.lhs
+++ b/compiler/basicTypes/NameSet.lhs
@@ -5,36 +5,29 @@
\begin{code}
{-# LANGUAGE CPP #-}
-{-# OPTIONS_GHC -fno-warn-tabs #-}
--- The above warning supression flag is a temporary kludge.
--- While working on this module you are encouraged to remove it and
--- detab the module (please do the detabbing in a separate patch). See
--- http://ghc.haskell.org/trac/ghc/wiki/Commentary/CodingStyle#TabsvsSpaces
--- for details
-
module NameSet (
- -- * Names set type
- NameSet,
-
- -- ** Manipulating these sets
- emptyNameSet, unitNameSet, mkNameSet, unionNameSets, unionManyNameSets,
- minusNameSet, elemNameSet, nameSetToList, addOneToNameSet, addListToNameSet,
- delFromNameSet, delListFromNameSet, isEmptyNameSet, foldNameSet, filterNameSet,
- intersectsNameSet, intersectNameSet,
-
- -- * Free variables
- FreeVars,
-
- -- ** Manipulating sets of free variables
- isEmptyFVs, emptyFVs, plusFVs, plusFV,
- mkFVs, addOneFV, unitFV, delFV, delFVs,
-
- -- * Defs and uses
- Defs, Uses, DefUse, DefUses,
-
- -- ** Manipulating defs and uses
- emptyDUs, usesOnly, mkDUs, plusDU,
- findUses, duDefs, duUses, allUses
+ -- * Names set type
+ NameSet,
+
+ -- ** Manipulating these sets
+ emptyNameSet, unitNameSet, mkNameSet, unionNameSets, unionManyNameSets,
+ minusNameSet, elemNameSet, nameSetToList, addOneToNameSet, addListToNameSet,
+ delFromNameSet, delListFromNameSet, isEmptyNameSet, foldNameSet, filterNameSet,
+ intersectsNameSet, intersectNameSet,
+
+ -- * Free variables
+ FreeVars,
+
+ -- ** Manipulating sets of free variables
+ isEmptyFVs, emptyFVs, plusFVs, plusFV,
+ mkFVs, addOneFV, unitFV, delFV, delFVs,
+
+ -- * Defs and uses
+ Defs, Uses, DefUse, DefUses,
+
+ -- ** Manipulating defs and uses
+ emptyDUs, usesOnly, mkDUs, plusDU,
+ findUses, duDefs, duUses, allUses
) where
#include "HsVersions.h"
@@ -44,48 +37,48 @@ import UniqSet
\end{code}
%************************************************************************
-%* *
+%* *
\subsection[Sets of names}
-%* *
+%* *
%************************************************************************
\begin{code}
type NameSet = UniqSet Name
emptyNameSet :: NameSet
-unitNameSet :: Name -> NameSet
+unitNameSet :: Name -> NameSet
addListToNameSet :: NameSet -> [Name] -> NameSet
addOneToNameSet :: NameSet -> Name -> NameSet
mkNameSet :: [Name] -> NameSet
-unionNameSets :: NameSet -> NameSet -> NameSet
+unionNameSets :: NameSet -> NameSet -> NameSet
unionManyNameSets :: [NameSet] -> NameSet
-minusNameSet :: NameSet -> NameSet -> NameSet
-elemNameSet :: Name -> NameSet -> Bool
-nameSetToList :: NameSet -> [Name]
-isEmptyNameSet :: NameSet -> Bool
-delFromNameSet :: NameSet -> Name -> NameSet
+minusNameSet :: NameSet -> NameSet -> NameSet
+elemNameSet :: Name -> NameSet -> Bool
+nameSetToList :: NameSet -> [Name]
+isEmptyNameSet :: NameSet -> Bool
+delFromNameSet :: NameSet -> Name -> NameSet
delListFromNameSet :: NameSet -> [Name] -> NameSet
-foldNameSet :: (Name -> b -> b) -> b -> NameSet -> b
-filterNameSet :: (Name -> Bool) -> NameSet -> NameSet
+foldNameSet :: (Name -> b -> b) -> b -> NameSet -> b
+filterNameSet :: (Name -> Bool) -> NameSet -> NameSet
intersectNameSet :: NameSet -> NameSet -> NameSet
intersectsNameSet :: NameSet -> NameSet -> Bool
-- ^ True if there is a non-empty intersection.
-- @s1 `intersectsNameSet` s2@ doesn't compute @s2@ if @s1@ is empty
isEmptyNameSet = isEmptyUniqSet
-emptyNameSet = emptyUniqSet
-unitNameSet = unitUniqSet
+emptyNameSet = emptyUniqSet
+unitNameSet = unitUniqSet
mkNameSet = mkUniqSet
addListToNameSet = addListToUniqSet
-addOneToNameSet = addOneToUniqSet
+addOneToNameSet = addOneToUniqSet
unionNameSets = unionUniqSets
unionManyNameSets = unionManyUniqSets
-minusNameSet = minusUniqSet
+minusNameSet = minusUniqSet
elemNameSet = elementOfUniqSet
nameSetToList = uniqSetToList
delFromNameSet = delOneFromUniqSet
-foldNameSet = foldUniqSet
-filterNameSet = filterUniqSet
+foldNameSet = foldUniqSet
+filterNameSet = filterUniqSet
intersectNameSet = intersectUniqSets
delListFromNameSet set ns = foldl delFromNameSet set ns
@@ -95,22 +88,22 @@ intersectsNameSet s1 s2 = not (isEmptyNameSet (s1 `intersectNameSet` s2))
%************************************************************************
-%* *
+%* *
\subsection{Free variables}
-%* *
+%* *
%************************************************************************
These synonyms are useful when we are thinking of free variables
\begin{code}
-type FreeVars = NameSet
+type FreeVars = NameSet
plusFV :: FreeVars -> FreeVars -> FreeVars
addOneFV :: FreeVars -> Name -> FreeVars
unitFV :: Name -> FreeVars
emptyFVs :: FreeVars
plusFVs :: [FreeVars] -> FreeVars
-mkFVs :: [Name] -> FreeVars
+mkFVs :: [Name] -> FreeVars
delFV :: Name -> FreeVars -> FreeVars
delFVs :: [Name] -> FreeVars -> FreeVars
@@ -119,7 +112,7 @@ isEmptyFVs = isEmptyNameSet
emptyFVs = emptyNameSet
plusFVs = unionManyNameSets
plusFV = unionNameSets
-mkFVs = mkNameSet
+mkFVs = mkNameSet
addOneFV = addOneToNameSet
unitFV = unitNameSet
delFV n s = delFromNameSet s n
@@ -128,9 +121,9 @@ delFVs ns s = delListFromNameSet s ns
%************************************************************************
-%* *
- Defs and uses
-%* *
+%* *
+ Defs and uses
+%* *
%************************************************************************
\begin{code}
@@ -145,8 +138,8 @@ type Uses = NameSet
-- Also, @us@ may mention @ds@.
--
-- @Nothing =>@ Nothing is defined in this group, but
--- nevertheless all the uses are essential.
--- Used for instance declarations, for example
+-- nevertheless all the uses are essential.
+-- Used for instance declarations, for example
type DefUse = (Maybe Defs, Uses)
-- | A number of 'DefUse's in dependency order: earlier 'Defs' scope over later 'Uses'
@@ -184,23 +177,23 @@ duUses dus = foldr get emptyNameSet dus
where
get (Nothing, rhs_uses) uses = rhs_uses `unionNameSets` uses
get (Just defs, rhs_uses) uses = (rhs_uses `unionNameSets` uses)
- `minusNameSet` defs
+ `minusNameSet` defs
findUses :: DefUses -> Uses -> Uses
-- ^ Given some 'DefUses' and some 'Uses', find all the uses, transitively.
--- The result is a superset of the input 'Uses'; and includes things defined
+-- The result is a superset of the input 'Uses'; and includes things defined
-- in the input 'DefUses' (but only if they are used)
-findUses dus uses
+findUses dus uses
= foldr get uses dus
where
get (Nothing, rhs_uses) uses
- = rhs_uses `unionNameSets` uses
+ = rhs_uses `unionNameSets` uses
get (Just defs, rhs_uses) uses
- | defs `intersectsNameSet` uses -- Used
- || any (startsWithUnderscore . nameOccName) (nameSetToList defs)
- -- At least one starts with an "_",
- -- so treat the group as used
- = rhs_uses `unionNameSets` uses
- | otherwise -- No def is used
- = uses
+ | defs `intersectsNameSet` uses -- Used
+ || any (startsWithUnderscore . nameOccName) (nameSetToList defs)
+ -- At least one starts with an "_",
+ -- so treat the group as used
+ = rhs_uses `unionNameSets` uses
+ | otherwise -- No def is used
+ = uses
\end{code}