ghc-7.0.4: The GHC API

NameSet

Contents

- Names set type
  - Manipulating these sets
- Free variables
  - Manipulating sets of free variables
- Defs and uses
  - Manipulating defs and uses

Synopsis

- type NameSet = UniqSet Name
- emptyNameSet :: NameSet
- unitNameSet :: Name -> NameSet
- mkNameSet :: [Name] -> NameSet
- unionNameSets :: NameSet -> NameSet -> NameSet
- unionManyNameSets :: [NameSet] -> NameSet
- minusNameSet :: NameSet -> NameSet -> NameSet
- elemNameSet :: Name -> NameSet -> Bool
- nameSetToList :: NameSet -> [Name]
- addOneToNameSet :: NameSet -> Name -> NameSet
- addListToNameSet :: NameSet -> [Name] -> NameSet
- delFromNameSet :: NameSet -> Name -> NameSet
- delListFromNameSet :: NameSet -> [Name] -> NameSet
- isEmptyNameSet :: NameSet -> Bool
- foldNameSet :: (Name -> b -> b) -> b -> NameSet -> b
- filterNameSet :: (Name -> Bool) -> NameSet -> NameSet
- intersectsNameSet :: NameSet -> NameSet -> Bool
- intersectNameSet :: NameSet -> NameSet -> NameSet
- type FreeVars = NameSet
- isEmptyFVs :: NameSet -> Bool
- emptyFVs :: FreeVars
- plusFVs :: [FreeVars] -> FreeVars
- plusFV :: FreeVars -> FreeVars -> FreeVars
- mkFVs :: [Name] -> FreeVars
- addOneFV :: FreeVars -> Name -> FreeVars
- unitFV :: Name -> FreeVars
- delFV :: Name -> FreeVars -> FreeVars
- delFVs :: [Name] -> FreeVars -> FreeVars
- type Defs = NameSet
- type Uses = NameSet
- type DefUse = (Maybe Defs, Uses)
- type DefUses = [DefUse]
- emptyDUs :: DefUses
- usesOnly :: Uses -> DefUses
- mkDUs :: [(Defs, Uses)] -> DefUses
- plusDU :: DefUses -> DefUses -> DefUses
- findUses :: DefUses -> Uses -> Uses
- duDefs :: DefUses -> Defs
- duUses :: DefUses -> Uses
- allUses :: DefUses -> Uses

# Names set type

type NameSet = UniqSet Name Source

## Manipulating these sets

emptyNameSet :: NameSet Source

unitNameSet :: Name -> NameSet Source

mkNameSet :: [Name] -> NameSet Source

unionNameSets :: NameSet -> NameSet -> NameSet Source

unionManyNameSets :: [NameSet] -> NameSet Source

minusNameSet :: NameSet -> NameSet -> NameSet Source

elemNameSet :: Name -> NameSet -> Bool Source

nameSetToList :: NameSet -> [Name]Source

addOneToNameSet :: NameSet -> Name -> NameSet Source

addListToNameSet :: NameSet -> [Name] -> NameSet Source

delFromNameSet :: NameSet -> Name -> NameSet Source

delListFromNameSet :: NameSet -> [Name] -> NameSet Source

isEmptyNameSet :: NameSet -> Bool Source

foldNameSet :: (Name -> b -> b) -> b -> NameSet -> bSource

filterNameSet :: (Name -> Bool) -> NameSet -> NameSet Source

intersectsNameSet :: NameSet -> NameSet -> Bool Source

True if there is a non-empty intersection. `s1 `intersectsNameSet` s2` doesn't compute `s2` if `s1` is empty

intersectNameSet :: NameSet -> NameSet -> NameSet Source

# Free variables

type FreeVars = NameSet Source

## Manipulating sets of free variables

isEmptyFVs :: NameSet -> Bool Source

emptyFVs :: FreeVars Source

plusFVs :: [FreeVars] -> FreeVars Source

plusFV :: FreeVars -> FreeVars -> FreeVars Source

mkFVs :: [Name] -> FreeVars Source

addOneFV :: FreeVars -> Name -> FreeVars Source

unitFV :: Name -> FreeVars Source

delFV :: Name -> FreeVars -> FreeVars Source

delFVs :: [Name] -> FreeVars -> FreeVars Source

# Defs and uses

type Defs = NameSet Source

A set of names that are defined somewhere

type Uses = NameSet Source

A set of names that are used somewhere

type DefUse = (Maybe Defs, Uses)Source

`(Just ds, us) =>` The use of any member of the `ds` implies that all the `us` are used too. 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

type DefUses = [DefUse]Source

A number of `DefUse`s in dependency order: earlier `Defs` scope over later `Uses` In a single (def, use) pair, the defs also scope over the uses

## Manipulating defs and uses

emptyDUs :: DefUses Source

usesOnly :: Uses -> DefUses Source

mkDUs :: [(Defs, Uses)] -> DefUses Source

plusDU :: DefUses -> DefUses -> DefUses Source

findUses :: DefUses -> Uses -> Uses Source

Given some `DefUses` and some `Uses`, find all the uses, transitively. The result is a superset of the input `Uses`; and includes things defined in the input `DefUses` (but only if they are used)

duDefs :: DefUses -> Defs Source

duUses :: DefUses -> Uses Source

Collect all `Uses`, regardless of whether the group is itself used, but remove `Defs` on the way

allUses :: DefUses -> Uses Source

Just like `allUses`, but `Defs` are not eliminated from the `Uses` returned