{-# LANGUAGE DeriveDataTypeable #-}
{-# LANGUAGE BangPatterns #-}
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE LambdaCase #-}
module GHC.Types.Name.Occurrence (
NameSpace,
nameSpacesRelated,
tcName, clsName, tcClsName, dataName, varName,
tvName, srcDataName,
pprNameSpace, pprNonVarNameSpace, pprNameSpaceBrief,
OccName,
pprOccName,
mkOccName, mkOccNameFS,
mkVarOcc, mkVarOccFS,
mkDataOcc, mkDataOccFS,
mkTyVarOcc, mkTyVarOccFS,
mkTcOcc, mkTcOccFS,
mkClsOcc, mkClsOccFS,
mkDFunOcc,
setOccNameSpace,
demoteOccName,
HasOccName(..),
isDerivedOccName,
mkDataConWrapperOcc, mkWorkerOcc,
mkMatcherOcc, mkBuilderOcc,
mkDefaultMethodOcc, isDefaultMethodOcc, isTypeableBindOcc,
mkNewTyCoOcc, mkClassOpAuxOcc,
mkCon2TagOcc, mkTag2ConOcc, mkMaxTagOcc,
mkClassDataConOcc, mkDictOcc, mkIPOcc,
mkSpecOcc, mkForeignExportOcc, mkRepEqOcc,
mkGenR, mkGen1R,
mkDataTOcc, mkDataCOcc, mkDataConWorkerOcc,
mkSuperDictSelOcc, mkSuperDictAuxOcc,
mkLocalOcc, mkMethodOcc, mkInstTyTcOcc,
mkInstTyCoOcc, mkEqPredCoOcc,
mkRecFldSelOcc,
mkTyConRepOcc,
occNameFS, occNameString, occNameSpace,
isVarOcc, isTvOcc, isTcOcc, isDataOcc, isDataSymOcc, isSymOcc, isValOcc,
parenSymOcc, startsWithUnderscore,
isTcClsNameSpace, isTvNameSpace, isDataConNameSpace, isVarNameSpace, isValNameSpace,
OccEnv, emptyOccEnv, unitOccEnv, extendOccEnv, mapOccEnv,
lookupOccEnv, mkOccEnv, mkOccEnv_C, extendOccEnvList, elemOccEnv,
occEnvElts, foldOccEnv, plusOccEnv, plusOccEnv_C, extendOccEnv_C,
extendOccEnv_Acc, filterOccEnv, delListFromOccEnv, delFromOccEnv,
alterOccEnv, pprOccEnv,
OccSet, emptyOccSet, unitOccSet, mkOccSet, extendOccSet,
extendOccSetList,
unionOccSets, unionManyOccSets, minusOccSet, elemOccSet,
isEmptyOccSet, intersectOccSet,
filterOccSet,
TidyOccEnv, emptyTidyOccEnv, initTidyOccEnv,
tidyOccName, avoidClashesOccEnv, delTidyOccEnvList,
FastStringEnv, emptyFsEnv, lookupFsEnv, extendFsEnv, mkFsEnv
) where
import GHC.Prelude
import GHC.Utils.Misc
import GHC.Types.Unique
import GHC.Types.Unique.FM
import GHC.Types.Unique.Set
import GHC.Data.FastString
import GHC.Data.FastString.Env
import GHC.Utils.Outputable
import GHC.Utils.Lexeme
import GHC.Utils.Binary
import Control.DeepSeq
import Data.Char
import Data.Data
data NameSpace = VarName
| DataName
| TvName
| TcClsName
deriving( NameSpace -> NameSpace -> Bool
(NameSpace -> NameSpace -> Bool)
-> (NameSpace -> NameSpace -> Bool) -> Eq NameSpace
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: NameSpace -> NameSpace -> Bool
$c/= :: NameSpace -> NameSpace -> Bool
== :: NameSpace -> NameSpace -> Bool
$c== :: NameSpace -> NameSpace -> Bool
Eq, Eq NameSpace
Eq NameSpace
-> (NameSpace -> NameSpace -> Ordering)
-> (NameSpace -> NameSpace -> Bool)
-> (NameSpace -> NameSpace -> Bool)
-> (NameSpace -> NameSpace -> Bool)
-> (NameSpace -> NameSpace -> Bool)
-> (NameSpace -> NameSpace -> NameSpace)
-> (NameSpace -> NameSpace -> NameSpace)
-> Ord NameSpace
NameSpace -> NameSpace -> Bool
NameSpace -> NameSpace -> Ordering
NameSpace -> NameSpace -> NameSpace
forall a.
Eq a
-> (a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
min :: NameSpace -> NameSpace -> NameSpace
$cmin :: NameSpace -> NameSpace -> NameSpace
max :: NameSpace -> NameSpace -> NameSpace
$cmax :: NameSpace -> NameSpace -> NameSpace
>= :: NameSpace -> NameSpace -> Bool
$c>= :: NameSpace -> NameSpace -> Bool
> :: NameSpace -> NameSpace -> Bool
$c> :: NameSpace -> NameSpace -> Bool
<= :: NameSpace -> NameSpace -> Bool
$c<= :: NameSpace -> NameSpace -> Bool
< :: NameSpace -> NameSpace -> Bool
$c< :: NameSpace -> NameSpace -> Bool
compare :: NameSpace -> NameSpace -> Ordering
$ccompare :: NameSpace -> NameSpace -> Ordering
Instance of class: Eq of the constraint type Eq NameSpace
Instance of class: Ord of the constraint type Ord NameSpace
Instance of class: Eq of the constraint type Eq NameSpace
Ord )
tcName, clsName, tcClsName :: NameSpace
dataName, srcDataName :: NameSpace
tvName, varName :: NameSpace
tcName :: NameSpace
tcName = NameSpace
TcClsName
clsName :: NameSpace
clsName = NameSpace
TcClsName
tcClsName :: NameSpace
tcClsName = NameSpace
TcClsName
dataName :: NameSpace
dataName = NameSpace
DataName
srcDataName :: NameSpace
srcDataName = NameSpace
DataName
tvName :: NameSpace
tvName = NameSpace
TvName
varName :: NameSpace
varName = NameSpace
VarName
isDataConNameSpace :: NameSpace -> Bool
isDataConNameSpace :: NameSpace -> Bool
isDataConNameSpace NameSpace
DataName = Bool
True
isDataConNameSpace NameSpace
_ = Bool
False
isTcClsNameSpace :: NameSpace -> Bool
isTcClsNameSpace :: NameSpace -> Bool
isTcClsNameSpace NameSpace
TcClsName = Bool
True
isTcClsNameSpace NameSpace
_ = Bool
False
isTvNameSpace :: NameSpace -> Bool
isTvNameSpace :: NameSpace -> Bool
isTvNameSpace NameSpace
TvName = Bool
True
isTvNameSpace NameSpace
_ = Bool
False
isVarNameSpace :: NameSpace -> Bool
isVarNameSpace :: NameSpace -> Bool
isVarNameSpace NameSpace
TvName = Bool
True
isVarNameSpace NameSpace
VarName = Bool
True
isVarNameSpace NameSpace
_ = Bool
False
isValNameSpace :: NameSpace -> Bool
isValNameSpace :: NameSpace -> Bool
isValNameSpace NameSpace
DataName = Bool
True
isValNameSpace NameSpace
VarName = Bool
True
isValNameSpace NameSpace
_ = Bool
False
pprNameSpace :: NameSpace -> SDoc
pprNameSpace :: NameSpace -> SDoc
pprNameSpace NameSpace
DataName = [Char] -> SDoc
text [Char]
"data constructor"
pprNameSpace NameSpace
VarName = [Char] -> SDoc
text [Char]
"variable"
pprNameSpace NameSpace
TvName = [Char] -> SDoc
text [Char]
"type variable"
pprNameSpace NameSpace
TcClsName = [Char] -> SDoc
text [Char]
"type constructor or class"
pprNonVarNameSpace :: NameSpace -> SDoc
pprNonVarNameSpace :: NameSpace -> SDoc
pprNonVarNameSpace NameSpace
VarName = SDoc
empty
pprNonVarNameSpace NameSpace
ns = NameSpace -> SDoc
pprNameSpace NameSpace
ns
pprNameSpaceBrief :: NameSpace -> SDoc
pprNameSpaceBrief :: NameSpace -> SDoc
pprNameSpaceBrief NameSpace
DataName = Char -> SDoc
char Char
'd'
pprNameSpaceBrief NameSpace
VarName = Char -> SDoc
char Char
'v'
pprNameSpaceBrief NameSpace
TvName = [Char] -> SDoc
text [Char]
"tv"
pprNameSpaceBrief NameSpace
TcClsName = [Char] -> SDoc
text [Char]
"tc"
demoteNameSpace :: NameSpace -> Maybe NameSpace
demoteNameSpace :: NameSpace -> Maybe NameSpace
demoteNameSpace NameSpace
VarName = Maybe NameSpace
forall a. Maybe a
Nothing
demoteNameSpace NameSpace
DataName = Maybe NameSpace
forall a. Maybe a
Nothing
demoteNameSpace NameSpace
TvName = Maybe NameSpace
forall a. Maybe a
Nothing
demoteNameSpace NameSpace
TcClsName = NameSpace -> Maybe NameSpace
forall a. a -> Maybe a
Just NameSpace
DataName
data OccName = OccName
{ OccName -> NameSpace
occNameSpace :: !NameSpace
, OccName -> FastString
occNameFS :: !FastString
}
instance Eq OccName where
(OccName NameSpace
sp1 FastString
s1) == :: OccName -> OccName -> Bool
== (OccName NameSpace
sp2 FastString
s2) = FastString
s1 FastString -> FastString -> Bool
forall a. Eq a => a -> a -> Bool
External instance of the constraint type Eq FastString
== FastString
s2 Bool -> Bool -> Bool
&& NameSpace
sp1 NameSpace -> NameSpace -> Bool
forall a. Eq a => a -> a -> Bool
Instance of class: Eq of the constraint type Eq NameSpace
== NameSpace
sp2
instance Ord OccName where
compare :: OccName -> OccName -> Ordering
compare (OccName NameSpace
sp1 FastString
s1) (OccName NameSpace
sp2 FastString
s2)
= (FastString
s1 FastString -> FastString -> Ordering
forall a. Ord a => a -> a -> Ordering
External instance of the constraint type Ord FastString
`compare` FastString
s2) Ordering -> Ordering -> Ordering
`thenCmp` (NameSpace
sp1 NameSpace -> NameSpace -> Ordering
forall a. Ord a => a -> a -> Ordering
Instance of class: Ord of the constraint type Ord NameSpace
`compare` NameSpace
sp2)
instance Data OccName where
toConstr :: OccName -> Constr
toConstr OccName
_ = [Char] -> Constr
abstractConstr [Char]
"OccName"
gunfold :: (forall b r. Data b => c (b -> r) -> c r)
-> (forall r. r -> c r) -> Constr -> c OccName
gunfold forall b r. Data b => c (b -> r) -> c r
_ forall r. r -> c r
_ = [Char] -> Constr -> c OccName
forall a. HasCallStack => [Char] -> a
error [Char]
"gunfold"
dataTypeOf :: OccName -> DataType
dataTypeOf OccName
_ = [Char] -> DataType
mkNoRepType [Char]
"OccName"
instance HasOccName OccName where
occName :: OccName -> OccName
occName = OccName -> OccName
forall a. a -> a
id
instance NFData OccName where
rnf :: OccName -> ()
rnf OccName
x = OccName
x OccName -> () -> ()
`seq` ()
instance Outputable OccName where
ppr :: OccName -> SDoc
ppr = OccName -> SDoc
pprOccName
instance OutputableBndr OccName where
pprBndr :: BindingSite -> OccName -> SDoc
pprBndr BindingSite
_ = OccName -> SDoc
forall a. Outputable a => a -> SDoc
Instance of class: Outputable of the constraint type Outputable OccName
ppr
pprInfixOcc :: OccName -> SDoc
pprInfixOcc OccName
n = Bool -> SDoc -> SDoc
pprInfixVar (OccName -> Bool
isSymOcc OccName
n) (OccName -> SDoc
forall a. Outputable a => a -> SDoc
Instance of class: Outputable of the constraint type Outputable OccName
ppr OccName
n)
pprPrefixOcc :: OccName -> SDoc
pprPrefixOcc OccName
n = Bool -> SDoc -> SDoc
pprPrefixVar (OccName -> Bool
isSymOcc OccName
n) (OccName -> SDoc
forall a. Outputable a => a -> SDoc
Instance of class: Outputable of the constraint type Outputable OccName
ppr OccName
n)
pprOccName :: OccName -> SDoc
pprOccName :: OccName -> SDoc
pprOccName (OccName NameSpace
sp FastString
occ)
= (PprStyle -> SDoc) -> SDoc
getPprStyle ((PprStyle -> SDoc) -> SDoc) -> (PprStyle -> SDoc) -> SDoc
forall a b. (a -> b) -> a -> b
$ \ PprStyle
sty ->
if PprStyle -> Bool
codeStyle PprStyle
sty
then FastZString -> SDoc
ztext (FastString -> FastZString
zEncodeFS FastString
occ)
else SDoc
pp_occ SDoc -> SDoc -> SDoc
<> SDoc -> SDoc
whenPprDebug (SDoc -> SDoc
braces (NameSpace -> SDoc
pprNameSpaceBrief NameSpace
sp))
where
pp_occ :: SDoc
pp_occ = (SDocContext -> Bool) -> (Bool -> SDoc) -> SDoc
forall a. (SDocContext -> a) -> (a -> SDoc) -> SDoc
sdocOption SDocContext -> Bool
sdocSuppressUniques ((Bool -> SDoc) -> SDoc) -> (Bool -> SDoc) -> SDoc
forall a b. (a -> b) -> a -> b
$ \case
Bool
True -> [Char] -> SDoc
text ([Char] -> [Char]
strip_th_unique (FastString -> [Char]
unpackFS FastString
occ))
Bool
False -> FastString -> SDoc
ftext FastString
occ
strip_th_unique :: [Char] -> [Char]
strip_th_unique (Char
'[' : Char
c : [Char]
_) | Char -> Bool
isAlphaNum Char
c = []
strip_th_unique (Char
c : [Char]
cs) = Char
c Char -> [Char] -> [Char]
forall a. a -> [a] -> [a]
: [Char] -> [Char]
strip_th_unique [Char]
cs
strip_th_unique [] = []
mkOccName :: NameSpace -> String -> OccName
mkOccName :: NameSpace -> [Char] -> OccName
mkOccName NameSpace
occ_sp [Char]
str = NameSpace -> FastString -> OccName
OccName NameSpace
occ_sp ([Char] -> FastString
mkFastString [Char]
str)
mkOccNameFS :: NameSpace -> FastString -> OccName
mkOccNameFS :: NameSpace -> FastString -> OccName
mkOccNameFS NameSpace
occ_sp FastString
fs = NameSpace -> FastString -> OccName
OccName NameSpace
occ_sp FastString
fs
mkVarOcc :: String -> OccName
mkVarOcc :: [Char] -> OccName
mkVarOcc [Char]
s = NameSpace -> [Char] -> OccName
mkOccName NameSpace
varName [Char]
s
mkVarOccFS :: FastString -> OccName
mkVarOccFS :: FastString -> OccName
mkVarOccFS FastString
fs = NameSpace -> FastString -> OccName
mkOccNameFS NameSpace
varName FastString
fs
mkDataOcc :: String -> OccName
mkDataOcc :: [Char] -> OccName
mkDataOcc = NameSpace -> [Char] -> OccName
mkOccName NameSpace
dataName
mkDataOccFS :: FastString -> OccName
mkDataOccFS :: FastString -> OccName
mkDataOccFS = NameSpace -> FastString -> OccName
mkOccNameFS NameSpace
dataName
mkTyVarOcc :: String -> OccName
mkTyVarOcc :: [Char] -> OccName
mkTyVarOcc = NameSpace -> [Char] -> OccName
mkOccName NameSpace
tvName
mkTyVarOccFS :: FastString -> OccName
mkTyVarOccFS :: FastString -> OccName
mkTyVarOccFS FastString
fs = NameSpace -> FastString -> OccName
mkOccNameFS NameSpace
tvName FastString
fs
mkTcOcc :: String -> OccName
mkTcOcc :: [Char] -> OccName
mkTcOcc = NameSpace -> [Char] -> OccName
mkOccName NameSpace
tcName
mkTcOccFS :: FastString -> OccName
mkTcOccFS :: FastString -> OccName
mkTcOccFS = NameSpace -> FastString -> OccName
mkOccNameFS NameSpace
tcName
mkClsOcc :: String -> OccName
mkClsOcc :: [Char] -> OccName
mkClsOcc = NameSpace -> [Char] -> OccName
mkOccName NameSpace
clsName
mkClsOccFS :: FastString -> OccName
mkClsOccFS :: FastString -> OccName
mkClsOccFS = NameSpace -> FastString -> OccName
mkOccNameFS NameSpace
clsName
demoteOccName :: OccName -> Maybe OccName
demoteOccName :: OccName -> Maybe OccName
demoteOccName (OccName NameSpace
space FastString
name) = do
NameSpace
space' <- NameSpace -> Maybe NameSpace
demoteNameSpace NameSpace
space
OccName -> Maybe OccName
forall (m :: * -> *) a. Monad m => a -> m a
External instance of the constraint type Monad Maybe
return (OccName -> Maybe OccName) -> OccName -> Maybe OccName
forall a b. (a -> b) -> a -> b
$ NameSpace -> FastString -> OccName
OccName NameSpace
space' FastString
name
nameSpacesRelated :: NameSpace -> NameSpace -> Bool
nameSpacesRelated :: NameSpace -> NameSpace -> Bool
nameSpacesRelated NameSpace
ns1 NameSpace
ns2 = NameSpace
ns1 NameSpace -> NameSpace -> Bool
forall a. Eq a => a -> a -> Bool
Instance of class: Eq of the constraint type Eq NameSpace
== NameSpace
ns2 Bool -> Bool -> Bool
|| NameSpace -> NameSpace
otherNameSpace NameSpace
ns1 NameSpace -> NameSpace -> Bool
forall a. Eq a => a -> a -> Bool
Instance of class: Eq of the constraint type Eq NameSpace
== NameSpace
ns2
otherNameSpace :: NameSpace -> NameSpace
otherNameSpace :: NameSpace -> NameSpace
otherNameSpace NameSpace
VarName = NameSpace
DataName
otherNameSpace NameSpace
DataName = NameSpace
VarName
otherNameSpace NameSpace
TvName = NameSpace
TcClsName
otherNameSpace NameSpace
TcClsName = NameSpace
TvName
class HasOccName name where
occName :: name -> OccName
instance Uniquable OccName where
getUnique :: OccName -> Unique
getUnique (OccName NameSpace
VarName FastString
fs) = FastString -> Unique
mkVarOccUnique FastString
fs
getUnique (OccName NameSpace
DataName FastString
fs) = FastString -> Unique
mkDataOccUnique FastString
fs
getUnique (OccName NameSpace
TvName FastString
fs) = FastString -> Unique
mkTvOccUnique FastString
fs
getUnique (OccName NameSpace
TcClsName FastString
fs) = FastString -> Unique
mkTcOccUnique FastString
fs
newtype OccEnv a = A (UniqFM a)
deriving Typeable (OccEnv a)
DataType
Constr
Typeable (OccEnv a)
-> (forall (c :: * -> *).
(forall d b. Data d => c (d -> b) -> d -> c b)
-> (forall g. g -> c g) -> OccEnv a -> c (OccEnv a))
-> (forall (c :: * -> *).
(forall b r. Data b => c (b -> r) -> c r)
-> (forall r. r -> c r) -> Constr -> c (OccEnv a))
-> (OccEnv a -> Constr)
-> (OccEnv a -> DataType)
-> (forall (t :: * -> *) (c :: * -> *).
Typeable t =>
(forall d. Data d => c (t d)) -> Maybe (c (OccEnv a)))
-> (forall (t :: * -> * -> *) (c :: * -> *).
Typeable t =>
(forall d e. (Data d, Data e) => c (t d e))
-> Maybe (c (OccEnv a)))
-> ((forall b. Data b => b -> b) -> OccEnv a -> OccEnv a)
-> (forall r r'.
(r -> r' -> r)
-> r -> (forall d. Data d => d -> r') -> OccEnv a -> r)
-> (forall r r'.
(r' -> r -> r)
-> r -> (forall d. Data d => d -> r') -> OccEnv a -> r)
-> (forall u. (forall d. Data d => d -> u) -> OccEnv a -> [u])
-> (forall u. Int -> (forall d. Data d => d -> u) -> OccEnv a -> u)
-> (forall (m :: * -> *).
Monad m =>
(forall d. Data d => d -> m d) -> OccEnv a -> m (OccEnv a))
-> (forall (m :: * -> *).
MonadPlus m =>
(forall d. Data d => d -> m d) -> OccEnv a -> m (OccEnv a))
-> (forall (m :: * -> *).
MonadPlus m =>
(forall d. Data d => d -> m d) -> OccEnv a -> m (OccEnv a))
-> Data (OccEnv a)
OccEnv a -> DataType
OccEnv a -> Constr
(forall d. Data d => c (t d)) -> Maybe (c (OccEnv a))
(forall b. Data b => b -> b) -> OccEnv a -> OccEnv a
(forall d b. Data d => c (d -> b) -> d -> c b)
-> (forall g. g -> c g) -> OccEnv a -> c (OccEnv a)
(forall b r. Data b => c (b -> r) -> c r)
-> (forall r. r -> c r) -> Constr -> c (OccEnv a)
forall {a}. Data a => Typeable (OccEnv a)
forall a. Data a => OccEnv a -> DataType
forall a. Data a => OccEnv a -> Constr
forall a.
Data a =>
(forall b. Data b => b -> b) -> OccEnv a -> OccEnv a
forall a u.
Data a =>
Int -> (forall d. Data d => d -> u) -> OccEnv a -> u
forall a u.
Data a =>
(forall d. Data d => d -> u) -> OccEnv a -> [u]
forall a r r'.
Data a =>
(r -> r' -> r)
-> r -> (forall d. Data d => d -> r') -> OccEnv a -> r
forall a r r'.
Data a =>
(r' -> r -> r)
-> r -> (forall d. Data d => d -> r') -> OccEnv a -> r
forall a (m :: * -> *).
(Data a, Monad m) =>
(forall d. Data d => d -> m d) -> OccEnv a -> m (OccEnv a)
forall a (m :: * -> *).
(Data a, MonadPlus m) =>
(forall d. Data d => d -> m d) -> OccEnv a -> m (OccEnv a)
forall a (c :: * -> *).
Data a =>
(forall b r. Data b => c (b -> r) -> c r)
-> (forall r. r -> c r) -> Constr -> c (OccEnv a)
forall a (c :: * -> *).
Data a =>
(forall d b. Data d => c (d -> b) -> d -> c b)
-> (forall g. g -> c g) -> OccEnv a -> c (OccEnv a)
forall a (t :: * -> *) (c :: * -> *).
(Data a, Typeable t) =>
(forall d. Data d => c (t d)) -> Maybe (c (OccEnv a))
forall a (t :: * -> * -> *) (c :: * -> *).
(Data a, Typeable t) =>
(forall d e. (Data d, Data e) => c (t d e)) -> Maybe (c (OccEnv a))
forall a.
Typeable a
-> (forall (c :: * -> *).
(forall d b. Data d => c (d -> b) -> d -> c b)
-> (forall g. g -> c g) -> a -> c a)
-> (forall (c :: * -> *).
(forall b r. Data b => c (b -> r) -> c r)
-> (forall r. r -> c r) -> Constr -> c a)
-> (a -> Constr)
-> (a -> DataType)
-> (forall (t :: * -> *) (c :: * -> *).
Typeable t =>
(forall d. Data d => c (t d)) -> Maybe (c a))
-> (forall (t :: * -> * -> *) (c :: * -> *).
Typeable t =>
(forall d e. (Data d, Data e) => c (t d e)) -> Maybe (c a))
-> ((forall b. Data b => b -> b) -> a -> a)
-> (forall r r'.
(r -> r' -> r) -> r -> (forall d. Data d => d -> r') -> a -> r)
-> (forall r r'.
(r' -> r -> r) -> r -> (forall d. Data d => d -> r') -> a -> r)
-> (forall u. (forall d. Data d => d -> u) -> a -> [u])
-> (forall u. Int -> (forall d. Data d => d -> u) -> a -> u)
-> (forall (m :: * -> *).
Monad m =>
(forall d. Data d => d -> m d) -> a -> m a)
-> (forall (m :: * -> *).
MonadPlus m =>
(forall d. Data d => d -> m d) -> a -> m a)
-> (forall (m :: * -> *).
MonadPlus m =>
(forall d. Data d => d -> m d) -> a -> m a)
-> Data a
forall u. Int -> (forall d. Data d => d -> u) -> OccEnv a -> u
forall u. (forall d. Data d => d -> u) -> OccEnv a -> [u]
forall r r'.
(r -> r' -> r)
-> r -> (forall d. Data d => d -> r') -> OccEnv a -> r
forall r r'.
(r' -> r -> r)
-> r -> (forall d. Data d => d -> r') -> OccEnv a -> r
forall (m :: * -> *).
Monad m =>
(forall d. Data d => d -> m d) -> OccEnv a -> m (OccEnv a)
forall (m :: * -> *).
MonadPlus m =>
(forall d. Data d => d -> m d) -> OccEnv a -> m (OccEnv a)
forall (c :: * -> *).
(forall b r. Data b => c (b -> r) -> c r)
-> (forall r. r -> c r) -> Constr -> c (OccEnv a)
forall (c :: * -> *).
(forall d b. Data d => c (d -> b) -> d -> c b)
-> (forall g. g -> c g) -> OccEnv a -> c (OccEnv a)
forall (t :: * -> *) (c :: * -> *).
Typeable t =>
(forall d. Data d => c (t d)) -> Maybe (c (OccEnv a))
forall (t :: * -> * -> *) (c :: * -> *).
Typeable t =>
(forall d e. (Data d, Data e) => c (t d e)) -> Maybe (c (OccEnv a))
$cA :: Constr
$tOccEnv :: DataType
gmapMo :: (forall d. Data d => d -> m d) -> OccEnv a -> m (OccEnv a)
$cgmapMo :: forall a (m :: * -> *).
(Data a, MonadPlus m) =>
(forall d. Data d => d -> m d) -> OccEnv a -> m (OccEnv a)
gmapMp :: (forall d. Data d => d -> m d) -> OccEnv a -> m (OccEnv a)
$cgmapMp :: forall a (m :: * -> *).
(Data a, MonadPlus m) =>
(forall d. Data d => d -> m d) -> OccEnv a -> m (OccEnv a)
gmapM :: (forall d. Data d => d -> m d) -> OccEnv a -> m (OccEnv a)
$cgmapM :: forall a (m :: * -> *).
(Data a, Monad m) =>
(forall d. Data d => d -> m d) -> OccEnv a -> m (OccEnv a)
gmapQi :: Int -> (forall d. Data d => d -> u) -> OccEnv a -> u
$cgmapQi :: forall a u.
Data a =>
Int -> (forall d. Data d => d -> u) -> OccEnv a -> u
gmapQ :: (forall d. Data d => d -> u) -> OccEnv a -> [u]
$cgmapQ :: forall a u.
Data a =>
(forall d. Data d => d -> u) -> OccEnv a -> [u]
gmapQr :: (r' -> r -> r)
-> r -> (forall d. Data d => d -> r') -> OccEnv a -> r
$cgmapQr :: forall a r r'.
Data a =>
(r' -> r -> r)
-> r -> (forall d. Data d => d -> r') -> OccEnv a -> r
gmapQl :: (r -> r' -> r)
-> r -> (forall d. Data d => d -> r') -> OccEnv a -> r
$cgmapQl :: forall a r r'.
Data a =>
(r -> r' -> r)
-> r -> (forall d. Data d => d -> r') -> OccEnv a -> r
gmapT :: (forall b. Data b => b -> b) -> OccEnv a -> OccEnv a
$cgmapT :: forall a.
Data a =>
(forall b. Data b => b -> b) -> OccEnv a -> OccEnv a
dataCast2 :: (forall d e. (Data d, Data e) => c (t d e)) -> Maybe (c (OccEnv a))
$cdataCast2 :: forall a (t :: * -> * -> *) (c :: * -> *).
(Data a, Typeable t) =>
(forall d e. (Data d, Data e) => c (t d e)) -> Maybe (c (OccEnv a))
dataCast1 :: (forall d. Data d => c (t d)) -> Maybe (c (OccEnv a))
$cdataCast1 :: forall a (t :: * -> *) (c :: * -> *).
(Data a, Typeable t) =>
(forall d. Data d => c (t d)) -> Maybe (c (OccEnv a))
dataTypeOf :: OccEnv a -> DataType
$cdataTypeOf :: forall a. Data a => OccEnv a -> DataType
toConstr :: OccEnv a -> Constr
$ctoConstr :: forall a. Data a => OccEnv a -> Constr
gunfold :: (forall b r. Data b => c (b -> r) -> c r)
-> (forall r. r -> c r) -> Constr -> c (OccEnv a)
$cgunfold :: forall a (c :: * -> *).
Data a =>
(forall b r. Data b => c (b -> r) -> c r)
-> (forall r. r -> c r) -> Constr -> c (OccEnv a)
gfoldl :: (forall d b. Data d => c (d -> b) -> d -> c b)
-> (forall g. g -> c g) -> OccEnv a -> c (OccEnv a)
$cgfoldl :: forall a (c :: * -> *).
Data a =>
(forall d b. Data d => c (d -> b) -> d -> c b)
-> (forall g. g -> c g) -> OccEnv a -> c (OccEnv a)
Evidence bound by a type signature of the constraint type Typeable t
External instance of the constraint type forall ele. Data ele => Data (UniqFM ele)
External instance of the constraint type forall a. Data a => Typeable a
Evidence bound by a type signature of the constraint type Data a
External instance of the constraint type forall a. Data a => Typeable a
External instance of the constraint type forall a. Data a => Typeable a
Evidence bound by a type signature of the constraint type Data a
Evidence bound by a type signature of the constraint type Data a
Data
emptyOccEnv :: OccEnv a
unitOccEnv :: OccName -> a -> OccEnv a
extendOccEnv :: OccEnv a -> OccName -> a -> OccEnv a
extendOccEnvList :: OccEnv a -> [(OccName, a)] -> OccEnv a
lookupOccEnv :: OccEnv a -> OccName -> Maybe a
mkOccEnv :: [(OccName,a)] -> OccEnv a
mkOccEnv_C :: (a -> a -> a) -> [(OccName,a)] -> OccEnv a
elemOccEnv :: OccName -> OccEnv a -> Bool
foldOccEnv :: (a -> b -> b) -> b -> OccEnv a -> b
occEnvElts :: OccEnv a -> [a]
extendOccEnv_C :: (a->a->a) -> OccEnv a -> OccName -> a -> OccEnv a
extendOccEnv_Acc :: (a->b->b) -> (a->b) -> OccEnv b -> OccName -> a -> OccEnv b
plusOccEnv :: OccEnv a -> OccEnv a -> OccEnv a
plusOccEnv_C :: (a->a->a) -> OccEnv a -> OccEnv a -> OccEnv a
mapOccEnv :: (a->b) -> OccEnv a -> OccEnv b
delFromOccEnv :: OccEnv a -> OccName -> OccEnv a
delListFromOccEnv :: OccEnv a -> [OccName] -> OccEnv a
filterOccEnv :: (elt -> Bool) -> OccEnv elt -> OccEnv elt
alterOccEnv :: (Maybe elt -> Maybe elt) -> OccEnv elt -> OccName -> OccEnv elt
emptyOccEnv :: OccEnv a
emptyOccEnv = UniqFM a -> OccEnv a
forall a. UniqFM a -> OccEnv a
A UniqFM a
forall elt. UniqFM elt
emptyUFM
unitOccEnv :: OccName -> a -> OccEnv a
unitOccEnv OccName
x a
y = UniqFM a -> OccEnv a
forall a. UniqFM a -> OccEnv a
A (UniqFM a -> OccEnv a) -> UniqFM a -> OccEnv a
forall a b. (a -> b) -> a -> b
$ OccName -> a -> UniqFM a
forall key elt. Uniquable key => key -> elt -> UniqFM elt
Instance of class: Uniquable of the constraint type Uniquable OccName
unitUFM OccName
x a
y
extendOccEnv :: OccEnv a -> OccName -> a -> OccEnv a
extendOccEnv (A UniqFM a
x) OccName
y a
z = UniqFM a -> OccEnv a
forall a. UniqFM a -> OccEnv a
A (UniqFM a -> OccEnv a) -> UniqFM a -> OccEnv a
forall a b. (a -> b) -> a -> b
$ UniqFM a -> OccName -> a -> UniqFM a
forall key elt.
Uniquable key =>
UniqFM elt -> key -> elt -> UniqFM elt
Instance of class: Uniquable of the constraint type Uniquable OccName
addToUFM UniqFM a
x OccName
y a
z
extendOccEnvList :: OccEnv a -> [(OccName, a)] -> OccEnv a
extendOccEnvList (A UniqFM a
x) [(OccName, a)]
l = UniqFM a -> OccEnv a
forall a. UniqFM a -> OccEnv a
A (UniqFM a -> OccEnv a) -> UniqFM a -> OccEnv a
forall a b. (a -> b) -> a -> b
$ UniqFM a -> [(OccName, a)] -> UniqFM a
forall key elt.
Uniquable key =>
UniqFM elt -> [(key, elt)] -> UniqFM elt
Instance of class: Uniquable of the constraint type Uniquable OccName
addListToUFM UniqFM a
x [(OccName, a)]
l
lookupOccEnv :: OccEnv a -> OccName -> Maybe a
lookupOccEnv (A UniqFM a
x) OccName
y = UniqFM a -> OccName -> Maybe a
forall key elt. Uniquable key => UniqFM elt -> key -> Maybe elt
Instance of class: Uniquable of the constraint type Uniquable OccName
lookupUFM UniqFM a
x OccName
y
mkOccEnv :: [(OccName, a)] -> OccEnv a
mkOccEnv [(OccName, a)]
l = UniqFM a -> OccEnv a
forall a. UniqFM a -> OccEnv a
A (UniqFM a -> OccEnv a) -> UniqFM a -> OccEnv a
forall a b. (a -> b) -> a -> b
$ [(OccName, a)] -> UniqFM a
forall key elt. Uniquable key => [(key, elt)] -> UniqFM elt
Instance of class: Uniquable of the constraint type Uniquable OccName
listToUFM [(OccName, a)]
l
elemOccEnv :: OccName -> OccEnv a -> Bool
elemOccEnv OccName
x (A UniqFM a
y) = OccName -> UniqFM a -> Bool
forall key elt. Uniquable key => key -> UniqFM elt -> Bool
Instance of class: Uniquable of the constraint type Uniquable OccName
elemUFM OccName
x UniqFM a
y
foldOccEnv :: (a -> b -> b) -> b -> OccEnv a -> b
foldOccEnv a -> b -> b
a b
b (A UniqFM a
c) = (a -> b -> b) -> b -> UniqFM a -> b
forall elt a. (elt -> a -> a) -> a -> UniqFM elt -> a
foldUFM a -> b -> b
a b
b UniqFM a
c
occEnvElts :: OccEnv a -> [a]
occEnvElts (A UniqFM a
x) = UniqFM a -> [a]
forall elt. UniqFM elt -> [elt]
eltsUFM UniqFM a
x
plusOccEnv :: OccEnv a -> OccEnv a -> OccEnv a
plusOccEnv (A UniqFM a
x) (A UniqFM a
y) = UniqFM a -> OccEnv a
forall a. UniqFM a -> OccEnv a
A (UniqFM a -> OccEnv a) -> UniqFM a -> OccEnv a
forall a b. (a -> b) -> a -> b
$ UniqFM a -> UniqFM a -> UniqFM a
forall elt. UniqFM elt -> UniqFM elt -> UniqFM elt
plusUFM UniqFM a
x UniqFM a
y
plusOccEnv_C :: (a -> a -> a) -> OccEnv a -> OccEnv a -> OccEnv a
plusOccEnv_C a -> a -> a
f (A UniqFM a
x) (A UniqFM a
y) = UniqFM a -> OccEnv a
forall a. UniqFM a -> OccEnv a
A (UniqFM a -> OccEnv a) -> UniqFM a -> OccEnv a
forall a b. (a -> b) -> a -> b
$ (a -> a -> a) -> UniqFM a -> UniqFM a -> UniqFM a
forall elt.
(elt -> elt -> elt) -> UniqFM elt -> UniqFM elt -> UniqFM elt
plusUFM_C a -> a -> a
f UniqFM a
x UniqFM a
y
extendOccEnv_C :: (a -> a -> a) -> OccEnv a -> OccName -> a -> OccEnv a
extendOccEnv_C a -> a -> a
f (A UniqFM a
x) OccName
y a
z = UniqFM a -> OccEnv a
forall a. UniqFM a -> OccEnv a
A (UniqFM a -> OccEnv a) -> UniqFM a -> OccEnv a
forall a b. (a -> b) -> a -> b
$ (a -> a -> a) -> UniqFM a -> OccName -> a -> UniqFM a
forall key elt.
Uniquable key =>
(elt -> elt -> elt) -> UniqFM elt -> key -> elt -> UniqFM elt
Instance of class: Uniquable of the constraint type Uniquable OccName
addToUFM_C a -> a -> a
f UniqFM a
x OccName
y a
z
extendOccEnv_Acc :: (a -> b -> b) -> (a -> b) -> OccEnv b -> OccName -> a -> OccEnv b
extendOccEnv_Acc a -> b -> b
f a -> b
g (A UniqFM b
x) OccName
y a
z = UniqFM b -> OccEnv b
forall a. UniqFM a -> OccEnv a
A (UniqFM b -> OccEnv b) -> UniqFM b -> OccEnv b
forall a b. (a -> b) -> a -> b
$ (a -> b -> b) -> (a -> b) -> UniqFM b -> OccName -> a -> UniqFM b
forall key elt elts.
Uniquable key =>
(elt -> elts -> elts)
-> (elt -> elts) -> UniqFM elts -> key -> elt -> UniqFM elts
Instance of class: Uniquable of the constraint type Uniquable OccName
addToUFM_Acc a -> b -> b
f a -> b
g UniqFM b
x OccName
y a
z
mapOccEnv :: (a -> b) -> OccEnv a -> OccEnv b
mapOccEnv a -> b
f (A UniqFM a
x) = UniqFM b -> OccEnv b
forall a. UniqFM a -> OccEnv a
A (UniqFM b -> OccEnv b) -> UniqFM b -> OccEnv b
forall a b. (a -> b) -> a -> b
$ (a -> b) -> UniqFM a -> UniqFM b
forall elt1 elt2. (elt1 -> elt2) -> UniqFM elt1 -> UniqFM elt2
mapUFM a -> b
f UniqFM a
x
mkOccEnv_C :: (a -> a -> a) -> [(OccName, a)] -> OccEnv a
mkOccEnv_C a -> a -> a
comb [(OccName, a)]
l = UniqFM a -> OccEnv a
forall a. UniqFM a -> OccEnv a
A (UniqFM a -> OccEnv a) -> UniqFM a -> OccEnv a
forall a b. (a -> b) -> a -> b
$ (a -> a -> a) -> UniqFM a -> [(OccName, a)] -> UniqFM a
forall key elt.
Uniquable key =>
(elt -> elt -> elt) -> UniqFM elt -> [(key, elt)] -> UniqFM elt
Instance of class: Uniquable of the constraint type Uniquable OccName
addListToUFM_C a -> a -> a
comb UniqFM a
forall elt. UniqFM elt
emptyUFM [(OccName, a)]
l
delFromOccEnv :: OccEnv a -> OccName -> OccEnv a
delFromOccEnv (A UniqFM a
x) OccName
y = UniqFM a -> OccEnv a
forall a. UniqFM a -> OccEnv a
A (UniqFM a -> OccEnv a) -> UniqFM a -> OccEnv a
forall a b. (a -> b) -> a -> b
$ UniqFM a -> OccName -> UniqFM a
forall key elt. Uniquable key => UniqFM elt -> key -> UniqFM elt
Instance of class: Uniquable of the constraint type Uniquable OccName
delFromUFM UniqFM a
x OccName
y
delListFromOccEnv :: OccEnv a -> [OccName] -> OccEnv a
delListFromOccEnv (A UniqFM a
x) [OccName]
y = UniqFM a -> OccEnv a
forall a. UniqFM a -> OccEnv a
A (UniqFM a -> OccEnv a) -> UniqFM a -> OccEnv a
forall a b. (a -> b) -> a -> b
$ UniqFM a -> [OccName] -> UniqFM a
forall key elt. Uniquable key => UniqFM elt -> [key] -> UniqFM elt
Instance of class: Uniquable of the constraint type Uniquable OccName
delListFromUFM UniqFM a
x [OccName]
y
filterOccEnv :: (elt -> Bool) -> OccEnv elt -> OccEnv elt
filterOccEnv elt -> Bool
x (A UniqFM elt
y) = UniqFM elt -> OccEnv elt
forall a. UniqFM a -> OccEnv a
A (UniqFM elt -> OccEnv elt) -> UniqFM elt -> OccEnv elt
forall a b. (a -> b) -> a -> b
$ (elt -> Bool) -> UniqFM elt -> UniqFM elt
forall elt. (elt -> Bool) -> UniqFM elt -> UniqFM elt
filterUFM elt -> Bool
x UniqFM elt
y
alterOccEnv :: (Maybe elt -> Maybe elt) -> OccEnv elt -> OccName -> OccEnv elt
alterOccEnv Maybe elt -> Maybe elt
fn (A UniqFM elt
y) OccName
k = UniqFM elt -> OccEnv elt
forall a. UniqFM a -> OccEnv a
A (UniqFM elt -> OccEnv elt) -> UniqFM elt -> OccEnv elt
forall a b. (a -> b) -> a -> b
$ (Maybe elt -> Maybe elt) -> UniqFM elt -> OccName -> UniqFM elt
forall key elt.
Uniquable key =>
(Maybe elt -> Maybe elt) -> UniqFM elt -> key -> UniqFM elt
Instance of class: Uniquable of the constraint type Uniquable OccName
alterUFM Maybe elt -> Maybe elt
fn UniqFM elt
y OccName
k
instance Outputable a => Outputable (OccEnv a) where
ppr :: OccEnv a -> SDoc
ppr OccEnv a
x = (a -> SDoc) -> OccEnv a -> SDoc
forall a. (a -> SDoc) -> OccEnv a -> SDoc
pprOccEnv a -> SDoc
forall a. Outputable a => a -> SDoc
Evidence bound by a type signature of the constraint type Outputable a
ppr OccEnv a
x
pprOccEnv :: (a -> SDoc) -> OccEnv a -> SDoc
pprOccEnv :: (a -> SDoc) -> OccEnv a -> SDoc
pprOccEnv a -> SDoc
ppr_elt (A UniqFM a
env) = (a -> SDoc) -> UniqFM a -> SDoc
forall a. (a -> SDoc) -> UniqFM a -> SDoc
pprUniqFM a -> SDoc
ppr_elt UniqFM a
env
type OccSet = UniqSet OccName
emptyOccSet :: OccSet
unitOccSet :: OccName -> OccSet
mkOccSet :: [OccName] -> OccSet
extendOccSet :: OccSet -> OccName -> OccSet
extendOccSetList :: OccSet -> [OccName] -> OccSet
unionOccSets :: OccSet -> OccSet -> OccSet
unionManyOccSets :: [OccSet] -> OccSet
minusOccSet :: OccSet -> OccSet -> OccSet
elemOccSet :: OccName -> OccSet -> Bool
isEmptyOccSet :: OccSet -> Bool
intersectOccSet :: OccSet -> OccSet -> OccSet
filterOccSet :: (OccName -> Bool) -> OccSet -> OccSet
emptyOccSet :: OccSet
emptyOccSet = OccSet
forall a. UniqSet a
emptyUniqSet
unitOccSet :: OccName -> OccSet
unitOccSet = OccName -> OccSet
forall a. Uniquable a => a -> UniqSet a
Instance of class: Uniquable of the constraint type Uniquable OccName
unitUniqSet
mkOccSet :: [OccName] -> OccSet
mkOccSet = [OccName] -> OccSet
forall a. Uniquable a => [a] -> UniqSet a
Instance of class: Uniquable of the constraint type Uniquable OccName
mkUniqSet
extendOccSet :: OccSet -> OccName -> OccSet
extendOccSet = OccSet -> OccName -> OccSet
forall a. Uniquable a => UniqSet a -> a -> UniqSet a
Instance of class: Uniquable of the constraint type Uniquable OccName
addOneToUniqSet
extendOccSetList :: OccSet -> [OccName] -> OccSet
extendOccSetList = OccSet -> [OccName] -> OccSet
forall a. Uniquable a => UniqSet a -> [a] -> UniqSet a
Instance of class: Uniquable of the constraint type Uniquable OccName
addListToUniqSet
unionOccSets :: OccSet -> OccSet -> OccSet
unionOccSets = OccSet -> OccSet -> OccSet
forall a. UniqSet a -> UniqSet a -> UniqSet a
unionUniqSets
unionManyOccSets :: [OccSet] -> OccSet
unionManyOccSets = [OccSet] -> OccSet
forall a. [UniqSet a] -> UniqSet a
unionManyUniqSets
minusOccSet :: OccSet -> OccSet -> OccSet
minusOccSet = OccSet -> OccSet -> OccSet
forall a. UniqSet a -> UniqSet a -> UniqSet a
minusUniqSet
elemOccSet :: OccName -> OccSet -> Bool
elemOccSet = OccName -> OccSet -> Bool
forall a. Uniquable a => a -> UniqSet a -> Bool
Instance of class: Uniquable of the constraint type Uniquable OccName
elementOfUniqSet
isEmptyOccSet :: OccSet -> Bool
isEmptyOccSet = OccSet -> Bool
forall a. UniqSet a -> Bool
isEmptyUniqSet
intersectOccSet :: OccSet -> OccSet -> OccSet
intersectOccSet = OccSet -> OccSet -> OccSet
forall a. UniqSet a -> UniqSet a -> UniqSet a
intersectUniqSets
filterOccSet :: (OccName -> Bool) -> OccSet -> OccSet
filterOccSet = (OccName -> Bool) -> OccSet -> OccSet
forall a. (a -> Bool) -> UniqSet a -> UniqSet a
filterUniqSet
occNameString :: OccName -> String
occNameString :: OccName -> [Char]
occNameString (OccName NameSpace
_ FastString
s) = FastString -> [Char]
unpackFS FastString
s
setOccNameSpace :: NameSpace -> OccName -> OccName
setOccNameSpace :: NameSpace -> OccName -> OccName
setOccNameSpace NameSpace
sp (OccName NameSpace
_ FastString
occ) = NameSpace -> FastString -> OccName
OccName NameSpace
sp FastString
occ
isVarOcc, isTvOcc, isTcOcc, isDataOcc :: OccName -> Bool
isVarOcc :: OccName -> Bool
isVarOcc (OccName NameSpace
VarName FastString
_) = Bool
True
isVarOcc OccName
_ = Bool
False
isTvOcc :: OccName -> Bool
isTvOcc (OccName NameSpace
TvName FastString
_) = Bool
True
isTvOcc OccName
_ = Bool
False
isTcOcc :: OccName -> Bool
isTcOcc (OccName NameSpace
TcClsName FastString
_) = Bool
True
isTcOcc OccName
_ = Bool
False
isValOcc :: OccName -> Bool
isValOcc :: OccName -> Bool
isValOcc (OccName NameSpace
VarName FastString
_) = Bool
True
isValOcc (OccName NameSpace
DataName FastString
_) = Bool
True
isValOcc OccName
_ = Bool
False
isDataOcc :: OccName -> Bool
isDataOcc (OccName NameSpace
DataName FastString
_) = Bool
True
isDataOcc OccName
_ = Bool
False
isDataSymOcc :: OccName -> Bool
isDataSymOcc :: OccName -> Bool
isDataSymOcc (OccName NameSpace
DataName FastString
s) = FastString -> Bool
isLexConSym FastString
s
isDataSymOcc OccName
_ = Bool
False
isSymOcc :: OccName -> Bool
isSymOcc :: OccName -> Bool
isSymOcc (OccName NameSpace
DataName FastString
s) = FastString -> Bool
isLexConSym FastString
s
isSymOcc (OccName NameSpace
TcClsName FastString
s) = FastString -> Bool
isLexSym FastString
s
isSymOcc (OccName NameSpace
VarName FastString
s) = FastString -> Bool
isLexSym FastString
s
isSymOcc (OccName NameSpace
TvName FastString
s) = FastString -> Bool
isLexSym FastString
s
parenSymOcc :: OccName -> SDoc -> SDoc
parenSymOcc :: OccName -> SDoc -> SDoc
parenSymOcc OccName
occ SDoc
doc | OccName -> Bool
isSymOcc OccName
occ = SDoc -> SDoc
parens SDoc
doc
| Bool
otherwise = SDoc
doc
startsWithUnderscore :: OccName -> Bool
startsWithUnderscore :: OccName -> Bool
startsWithUnderscore OccName
occ = FastString -> Char
headFS (OccName -> FastString
occNameFS OccName
occ) Char -> Char -> Bool
forall a. Eq a => a -> a -> Bool
External instance of the constraint type Eq Char
== Char
'_'
mk_deriv :: NameSpace
-> FastString
-> [FastString]
-> OccName
mk_deriv :: NameSpace -> FastString -> [FastString] -> OccName
mk_deriv NameSpace
occ_sp FastString
sys_prefix [FastString]
str =
NameSpace -> FastString -> OccName
mkOccNameFS NameSpace
occ_sp ([FastString] -> FastString
concatFS ([FastString] -> FastString) -> [FastString] -> FastString
forall a b. (a -> b) -> a -> b
$ FastString
sys_prefix FastString -> [FastString] -> [FastString]
forall a. a -> [a] -> [a]
: [FastString]
str)
isDerivedOccName :: OccName -> Bool
isDerivedOccName :: OccName -> Bool
isDerivedOccName OccName
occ =
case OccName -> [Char]
occNameString OccName
occ of
Char
'$':Char
c:[Char]
_ | Char -> Bool
isAlphaNum Char
c -> Bool
True
Char
c:Char
':':[Char]
_ | Char -> Bool
isAlphaNum Char
c -> Bool
True
[Char]
_other -> Bool
False
isDefaultMethodOcc :: OccName -> Bool
isDefaultMethodOcc :: OccName -> Bool
isDefaultMethodOcc OccName
occ =
case OccName -> [Char]
occNameString OccName
occ of
Char
'$':Char
'd':Char
'm':[Char]
_ -> Bool
True
[Char]
_ -> Bool
False
isTypeableBindOcc :: OccName -> Bool
isTypeableBindOcc :: OccName -> Bool
isTypeableBindOcc OccName
occ =
case OccName -> [Char]
occNameString OccName
occ of
Char
'$':Char
't':Char
'c':[Char]
_ -> Bool
True
Char
'$':Char
't':Char
'r':[Char]
_ -> Bool
True
[Char]
_ -> Bool
False
mkDataConWrapperOcc, mkWorkerOcc,
mkMatcherOcc, mkBuilderOcc,
mkDefaultMethodOcc,
mkClassDataConOcc, mkDictOcc,
mkIPOcc, mkSpecOcc, mkForeignExportOcc, mkRepEqOcc,
mkGenR, mkGen1R,
mkDataConWorkerOcc, mkNewTyCoOcc,
mkInstTyCoOcc, mkEqPredCoOcc, mkClassOpAuxOcc,
mkCon2TagOcc, mkTag2ConOcc, mkMaxTagOcc,
mkTyConRepOcc
:: OccName -> OccName
mkDataConWrapperOcc :: OccName -> OccName
mkDataConWrapperOcc = NameSpace -> FastString -> OccName -> OccName
mk_simple_deriv NameSpace
varName FastString
"$W"
mkWorkerOcc :: OccName -> OccName
mkWorkerOcc = NameSpace -> FastString -> OccName -> OccName
mk_simple_deriv NameSpace
varName FastString
"$w"
mkMatcherOcc :: OccName -> OccName
mkMatcherOcc = NameSpace -> FastString -> OccName -> OccName
mk_simple_deriv NameSpace
varName FastString
"$m"
mkBuilderOcc :: OccName -> OccName
mkBuilderOcc = NameSpace -> FastString -> OccName -> OccName
mk_simple_deriv NameSpace
varName FastString
"$b"
mkDefaultMethodOcc :: OccName -> OccName
mkDefaultMethodOcc = NameSpace -> FastString -> OccName -> OccName
mk_simple_deriv NameSpace
varName FastString
"$dm"
mkClassOpAuxOcc :: OccName -> OccName
mkClassOpAuxOcc = NameSpace -> FastString -> OccName -> OccName
mk_simple_deriv NameSpace
varName FastString
"$c"
mkDictOcc :: OccName -> OccName
mkDictOcc = NameSpace -> FastString -> OccName -> OccName
mk_simple_deriv NameSpace
varName FastString
"$d"
mkIPOcc :: OccName -> OccName
mkIPOcc = NameSpace -> FastString -> OccName -> OccName
mk_simple_deriv NameSpace
varName FastString
"$i"
mkSpecOcc :: OccName -> OccName
mkSpecOcc = NameSpace -> FastString -> OccName -> OccName
mk_simple_deriv NameSpace
varName FastString
"$s"
mkForeignExportOcc :: OccName -> OccName
mkForeignExportOcc = NameSpace -> FastString -> OccName -> OccName
mk_simple_deriv NameSpace
varName FastString
"$f"
mkRepEqOcc :: OccName -> OccName
mkRepEqOcc = NameSpace -> FastString -> OccName -> OccName
mk_simple_deriv NameSpace
tvName FastString
"$r"
mkClassDataConOcc :: OccName -> OccName
mkClassDataConOcc = NameSpace -> FastString -> OccName -> OccName
mk_simple_deriv NameSpace
dataName FastString
"C:"
mkNewTyCoOcc :: OccName -> OccName
mkNewTyCoOcc = NameSpace -> FastString -> OccName -> OccName
mk_simple_deriv NameSpace
tcName FastString
"N:"
mkInstTyCoOcc :: OccName -> OccName
mkInstTyCoOcc = NameSpace -> FastString -> OccName -> OccName
mk_simple_deriv NameSpace
tcName FastString
"D:"
mkEqPredCoOcc :: OccName -> OccName
mkEqPredCoOcc = NameSpace -> FastString -> OccName -> OccName
mk_simple_deriv NameSpace
tcName FastString
"$co"
mkCon2TagOcc :: OccName -> OccName
mkCon2TagOcc = NameSpace -> FastString -> OccName -> OccName
mk_simple_deriv NameSpace
varName FastString
"$con2tag_"
mkTag2ConOcc :: OccName -> OccName
mkTag2ConOcc = NameSpace -> FastString -> OccName -> OccName
mk_simple_deriv NameSpace
varName FastString
"$tag2con_"
mkMaxTagOcc :: OccName -> OccName
mkMaxTagOcc = NameSpace -> FastString -> OccName -> OccName
mk_simple_deriv NameSpace
varName FastString
"$maxtag_"
mkTyConRepOcc :: OccName -> OccName
mkTyConRepOcc OccName
occ = NameSpace -> FastString -> OccName -> OccName
mk_simple_deriv NameSpace
varName FastString
prefix OccName
occ
where
prefix :: FastString
prefix | OccName -> Bool
isDataOcc OccName
occ = FastString
"$tc'"
| Bool
otherwise = FastString
"$tc"
mkGenR :: OccName -> OccName
mkGenR = NameSpace -> FastString -> OccName -> OccName
mk_simple_deriv NameSpace
tcName FastString
"Rep_"
mkGen1R :: OccName -> OccName
mkGen1R = NameSpace -> FastString -> OccName -> OccName
mk_simple_deriv NameSpace
tcName FastString
"Rep1_"
mkRecFldSelOcc :: String -> OccName
mkRecFldSelOcc :: [Char] -> OccName
mkRecFldSelOcc [Char]
s = NameSpace -> FastString -> [FastString] -> OccName
mk_deriv NameSpace
varName FastString
"$sel" [[Char] -> FastString
fsLit [Char]
s]
mk_simple_deriv :: NameSpace -> FastString -> OccName -> OccName
mk_simple_deriv :: NameSpace -> FastString -> OccName -> OccName
mk_simple_deriv NameSpace
sp FastString
px OccName
occ = NameSpace -> FastString -> [FastString] -> OccName
mk_deriv NameSpace
sp FastString
px [OccName -> FastString
occNameFS OccName
occ]
mkDataConWorkerOcc :: OccName -> OccName
mkDataConWorkerOcc OccName
datacon_occ = NameSpace -> OccName -> OccName
setOccNameSpace NameSpace
varName OccName
datacon_occ
mkSuperDictAuxOcc :: Int -> OccName -> OccName
mkSuperDictAuxOcc :: Int -> OccName -> OccName
mkSuperDictAuxOcc Int
index OccName
cls_tc_occ
= NameSpace -> FastString -> [FastString] -> OccName
mk_deriv NameSpace
varName FastString
"$cp" [[Char] -> FastString
fsLit ([Char] -> FastString) -> [Char] -> FastString
forall a b. (a -> b) -> a -> b
$ Int -> [Char]
forall a. Show a => a -> [Char]
External instance of the constraint type Show Int
show Int
index, OccName -> FastString
occNameFS OccName
cls_tc_occ]
mkSuperDictSelOcc :: Int
-> OccName
-> OccName
mkSuperDictSelOcc :: Int -> OccName -> OccName
mkSuperDictSelOcc Int
index OccName
cls_tc_occ
= NameSpace -> FastString -> [FastString] -> OccName
mk_deriv NameSpace
varName FastString
"$p" [[Char] -> FastString
fsLit ([Char] -> FastString) -> [Char] -> FastString
forall a b. (a -> b) -> a -> b
$ Int -> [Char]
forall a. Show a => a -> [Char]
External instance of the constraint type Show Int
show Int
index, OccName -> FastString
occNameFS OccName
cls_tc_occ]
mkLocalOcc :: Unique
-> OccName
-> OccName
mkLocalOcc :: Unique -> OccName -> OccName
mkLocalOcc Unique
uniq OccName
occ
= NameSpace -> FastString -> [FastString] -> OccName
mk_deriv NameSpace
varName FastString
"$L" [[Char] -> FastString
fsLit ([Char] -> FastString) -> [Char] -> FastString
forall a b. (a -> b) -> a -> b
$ Unique -> [Char]
forall a. Show a => a -> [Char]
External instance of the constraint type Show Unique
show Unique
uniq, OccName -> FastString
occNameFS OccName
occ]
mkInstTyTcOcc :: String
-> OccSet
-> OccName
mkInstTyTcOcc :: [Char] -> OccSet -> OccName
mkInstTyTcOcc [Char]
str = NameSpace -> [Char] -> OccSet -> OccName
chooseUniqueOcc NameSpace
tcName (Char
'R' Char -> [Char] -> [Char]
forall a. a -> [a] -> [a]
: Char
':' Char -> [Char] -> [Char]
forall a. a -> [a] -> [a]
: [Char]
str)
mkDFunOcc :: String
-> Bool
-> OccSet
-> OccName
mkDFunOcc :: [Char] -> Bool -> OccSet -> OccName
mkDFunOcc [Char]
info_str Bool
is_boot OccSet
set
= NameSpace -> [Char] -> OccSet -> OccName
chooseUniqueOcc NameSpace
VarName ([Char]
prefix [Char] -> [Char] -> [Char]
forall a. [a] -> [a] -> [a]
++ [Char]
info_str) OccSet
set
where
prefix :: [Char]
prefix | Bool
is_boot = [Char]
"$fx"
| Bool
otherwise = [Char]
"$f"
mkDataTOcc, mkDataCOcc
:: OccName
-> OccSet
-> OccName
mkDataTOcc :: OccName -> OccSet -> OccName
mkDataTOcc OccName
occ = NameSpace -> [Char] -> OccSet -> OccName
chooseUniqueOcc NameSpace
VarName ([Char]
"$t" [Char] -> [Char] -> [Char]
forall a. [a] -> [a] -> [a]
++ OccName -> [Char]
occNameString OccName
occ)
mkDataCOcc :: OccName -> OccSet -> OccName
mkDataCOcc OccName
occ = NameSpace -> [Char] -> OccSet -> OccName
chooseUniqueOcc NameSpace
VarName ([Char]
"$c" [Char] -> [Char] -> [Char]
forall a. [a] -> [a] -> [a]
++ OccName -> [Char]
occNameString OccName
occ)
chooseUniqueOcc :: NameSpace -> String -> OccSet -> OccName
chooseUniqueOcc :: NameSpace -> [Char] -> OccSet -> OccName
chooseUniqueOcc NameSpace
ns [Char]
str OccSet
set = OccName -> Int -> OccName
forall {t}. (Show t, Num t) => OccName -> t -> OccName
External instance of the constraint type Num Int
External instance of the constraint type Show Int
loop (NameSpace -> [Char] -> OccName
mkOccName NameSpace
ns [Char]
str) (Int
0::Int)
where
loop :: OccName -> t -> OccName
loop OccName
occ t
n
| OccName
occ OccName -> OccSet -> Bool
`elemOccSet` OccSet
set = OccName -> t -> OccName
loop (NameSpace -> [Char] -> OccName
mkOccName NameSpace
ns ([Char]
str [Char] -> [Char] -> [Char]
forall a. [a] -> [a] -> [a]
++ t -> [Char]
forall a. Show a => a -> [Char]
Evidence bound by a type signature of the constraint type Show t
show t
n)) (t
nt -> t -> t
forall a. Num a => a -> a -> a
Evidence bound by a type signature of the constraint type Num t
+t
1)
| Bool
otherwise = OccName
occ
mkMethodOcc :: OccName -> OccName
mkMethodOcc :: OccName -> OccName
mkMethodOcc occ :: OccName
occ@(OccName NameSpace
VarName FastString
_) = OccName
occ
mkMethodOcc OccName
occ = NameSpace -> FastString -> OccName -> OccName
mk_simple_deriv NameSpace
varName FastString
"$m" OccName
occ
type TidyOccEnv = UniqFM Int
emptyTidyOccEnv :: TidyOccEnv
emptyTidyOccEnv :: TidyOccEnv
emptyTidyOccEnv = TidyOccEnv
forall elt. UniqFM elt
emptyUFM
initTidyOccEnv :: [OccName] -> TidyOccEnv
initTidyOccEnv :: [OccName] -> TidyOccEnv
initTidyOccEnv = (TidyOccEnv -> OccName -> TidyOccEnv)
-> TidyOccEnv -> [OccName] -> TidyOccEnv
forall (t :: * -> *) b a.
Foldable t =>
(b -> a -> b) -> b -> t a -> b
External instance of the constraint type Foldable []
foldl' TidyOccEnv -> OccName -> TidyOccEnv
forall {elt}. Num elt => UniqFM elt -> OccName -> UniqFM elt
External instance of the constraint type Num Int
add TidyOccEnv
forall elt. UniqFM elt
emptyUFM
where
add :: UniqFM elt -> OccName -> UniqFM elt
add UniqFM elt
env (OccName NameSpace
_ FastString
fs) = UniqFM elt -> FastString -> elt -> UniqFM elt
forall key elt.
Uniquable key =>
UniqFM elt -> key -> elt -> UniqFM elt
External instance of the constraint type Uniquable FastString
addToUFM UniqFM elt
env FastString
fs elt
1
delTidyOccEnvList :: TidyOccEnv -> [FastString] -> TidyOccEnv
delTidyOccEnvList :: TidyOccEnv -> [FastString] -> TidyOccEnv
delTidyOccEnvList = TidyOccEnv -> [FastString] -> TidyOccEnv
forall key elt. Uniquable key => UniqFM elt -> [key] -> UniqFM elt
External instance of the constraint type Uniquable FastString
delListFromUFM
avoidClashesOccEnv :: TidyOccEnv -> [OccName] -> TidyOccEnv
avoidClashesOccEnv :: TidyOccEnv -> [OccName] -> TidyOccEnv
avoidClashesOccEnv TidyOccEnv
env [OccName]
occs = TidyOccEnv -> UniqFM () -> [OccName] -> TidyOccEnv
forall {elt}.
Num elt =>
UniqFM elt -> UniqFM () -> [OccName] -> UniqFM elt
External instance of the constraint type Num Int
go TidyOccEnv
env UniqFM ()
forall elt. UniqFM elt
emptyUFM [OccName]
occs
where
go :: UniqFM elt -> UniqFM () -> [OccName] -> UniqFM elt
go UniqFM elt
env UniqFM ()
_ [] = UniqFM elt
env
go UniqFM elt
env UniqFM ()
seenOnce ((OccName NameSpace
_ FastString
fs):[OccName]
occs)
| FastString
fs FastString -> UniqFM elt -> Bool
forall key elt. Uniquable key => key -> UniqFM elt -> Bool
External instance of the constraint type Uniquable FastString
`elemUFM` UniqFM elt
env = UniqFM elt -> UniqFM () -> [OccName] -> UniqFM elt
go UniqFM elt
env UniqFM ()
seenOnce [OccName]
occs
| FastString
fs FastString -> UniqFM () -> Bool
forall key elt. Uniquable key => key -> UniqFM elt -> Bool
External instance of the constraint type Uniquable FastString
`elemUFM` UniqFM ()
seenOnce = UniqFM elt -> UniqFM () -> [OccName] -> UniqFM elt
go (UniqFM elt -> FastString -> elt -> UniqFM elt
forall key elt.
Uniquable key =>
UniqFM elt -> key -> elt -> UniqFM elt
External instance of the constraint type Uniquable FastString
addToUFM UniqFM elt
env FastString
fs elt
1) UniqFM ()
seenOnce [OccName]
occs
| Bool
otherwise = UniqFM elt -> UniqFM () -> [OccName] -> UniqFM elt
go UniqFM elt
env (UniqFM () -> FastString -> () -> UniqFM ()
forall key elt.
Uniquable key =>
UniqFM elt -> key -> elt -> UniqFM elt
External instance of the constraint type Uniquable FastString
addToUFM UniqFM ()
seenOnce FastString
fs ()) [OccName]
occs
tidyOccName :: TidyOccEnv -> OccName -> (TidyOccEnv, OccName)
tidyOccName :: TidyOccEnv -> OccName -> (TidyOccEnv, OccName)
tidyOccName TidyOccEnv
env occ :: OccName
occ@(OccName NameSpace
occ_sp FastString
fs)
| Bool -> Bool
not (FastString
fs FastString -> TidyOccEnv -> Bool
forall key elt. Uniquable key => key -> UniqFM elt -> Bool
External instance of the constraint type Uniquable FastString
`elemUFM` TidyOccEnv
env)
=
(TidyOccEnv -> FastString -> Int -> TidyOccEnv
forall key elt.
Uniquable key =>
UniqFM elt -> key -> elt -> UniqFM elt
External instance of the constraint type Uniquable FastString
addToUFM TidyOccEnv
env FastString
fs Int
1, OccName
occ)
| Bool
otherwise
= case TidyOccEnv -> FastString -> Maybe Int
forall key elt. Uniquable key => UniqFM elt -> key -> Maybe elt
External instance of the constraint type Uniquable FastString
lookupUFM TidyOccEnv
env FastString
base1 of
Maybe Int
Nothing -> (TidyOccEnv -> FastString -> Int -> TidyOccEnv
forall key elt.
Uniquable key =>
UniqFM elt -> key -> elt -> UniqFM elt
External instance of the constraint type Uniquable FastString
addToUFM TidyOccEnv
env FastString
base1 Int
2, NameSpace -> FastString -> OccName
OccName NameSpace
occ_sp FastString
base1)
Just Int
n -> Int -> Int -> (TidyOccEnv, OccName)
find Int
1 Int
n
where
base :: String
base :: [Char]
base = (Char -> Bool) -> [Char] -> [Char]
forall a. (a -> Bool) -> [a] -> [a]
dropWhileEndLE Char -> Bool
isDigit (FastString -> [Char]
unpackFS FastString
fs)
base1 :: FastString
base1 = [Char] -> FastString
mkFastString ([Char]
base [Char] -> [Char] -> [Char]
forall a. [a] -> [a] -> [a]
++ [Char]
"1")
find :: Int -> Int -> (TidyOccEnv, OccName)
find !Int
k !Int
n
= case TidyOccEnv -> FastString -> Maybe Int
forall key elt. Uniquable key => UniqFM elt -> key -> Maybe elt
External instance of the constraint type Uniquable FastString
lookupUFM TidyOccEnv
env FastString
new_fs of
Just {} -> Int -> Int -> (TidyOccEnv, OccName)
find (Int
kInt -> Int -> Int
forall a. Num a => a -> a -> a
External instance of the constraint type Num Int
+Int
1 :: Int) (Int
nInt -> Int -> Int
forall a. Num a => a -> a -> a
External instance of the constraint type Num Int
+Int
k)
Maybe Int
Nothing -> (TidyOccEnv
new_env, NameSpace -> FastString -> OccName
OccName NameSpace
occ_sp FastString
new_fs)
where
new_fs :: FastString
new_fs = [Char] -> FastString
mkFastString ([Char]
base [Char] -> [Char] -> [Char]
forall a. [a] -> [a] -> [a]
++ Int -> [Char]
forall a. Show a => a -> [Char]
External instance of the constraint type Show Int
show Int
n)
new_env :: TidyOccEnv
new_env = TidyOccEnv -> FastString -> Int -> TidyOccEnv
forall key elt.
Uniquable key =>
UniqFM elt -> key -> elt -> UniqFM elt
External instance of the constraint type Uniquable FastString
addToUFM (TidyOccEnv -> FastString -> Int -> TidyOccEnv
forall key elt.
Uniquable key =>
UniqFM elt -> key -> elt -> UniqFM elt
External instance of the constraint type Uniquable FastString
addToUFM TidyOccEnv
env FastString
new_fs Int
1) FastString
base1 (Int
nInt -> Int -> Int
forall a. Num a => a -> a -> a
External instance of the constraint type Num Int
+Int
1)
instance Binary NameSpace where
put_ :: BinHandle -> NameSpace -> IO ()
put_ BinHandle
bh NameSpace
VarName = do
BinHandle -> Word8 -> IO ()
putByte BinHandle
bh Word8
0
put_ BinHandle
bh NameSpace
DataName = do
BinHandle -> Word8 -> IO ()
putByte BinHandle
bh Word8
1
put_ BinHandle
bh NameSpace
TvName = do
BinHandle -> Word8 -> IO ()
putByte BinHandle
bh Word8
2
put_ BinHandle
bh NameSpace
TcClsName = do
BinHandle -> Word8 -> IO ()
putByte BinHandle
bh Word8
3
get :: BinHandle -> IO NameSpace
get BinHandle
bh = do
Word8
h <- BinHandle -> IO Word8
getByte BinHandle
bh
case Word8
h of
Word8
0 -> do NameSpace -> IO NameSpace
forall (m :: * -> *) a. Monad m => a -> m a
External instance of the constraint type Monad IO
return NameSpace
VarName
Word8
1 -> do NameSpace -> IO NameSpace
forall (m :: * -> *) a. Monad m => a -> m a
External instance of the constraint type Monad IO
return NameSpace
DataName
Word8
2 -> do NameSpace -> IO NameSpace
forall (m :: * -> *) a. Monad m => a -> m a
External instance of the constraint type Monad IO
return NameSpace
TvName
Word8
_ -> do NameSpace -> IO NameSpace
forall (m :: * -> *) a. Monad m => a -> m a
External instance of the constraint type Monad IO
return NameSpace
TcClsName
instance Binary OccName where
put_ :: BinHandle -> OccName -> IO ()
put_ BinHandle
bh (OccName NameSpace
aa FastString
ab) = do
BinHandle -> NameSpace -> IO ()
forall a. Binary a => BinHandle -> a -> IO ()
Instance of class: Binary of the constraint type Binary NameSpace
put_ BinHandle
bh NameSpace
aa
BinHandle -> FastString -> IO ()
forall a. Binary a => BinHandle -> a -> IO ()
External instance of the constraint type Binary FastString
put_ BinHandle
bh FastString
ab
get :: BinHandle -> IO OccName
get BinHandle
bh = do
NameSpace
aa <- BinHandle -> IO NameSpace
forall a. Binary a => BinHandle -> IO a
Instance of class: Binary of the constraint type Binary NameSpace
get BinHandle
bh
FastString
ab <- BinHandle -> IO FastString
forall a. Binary a => BinHandle -> IO a
External instance of the constraint type Binary FastString
get BinHandle
bh
OccName -> IO OccName
forall (m :: * -> *) a. Monad m => a -> m a
External instance of the constraint type Monad IO
return (NameSpace -> FastString -> OccName
OccName NameSpace
aa FastString
ab)