{-# LANGUAGE DeriveFunctor #-}
{-# LANGUAGE BangPatterns #-}
{-# LANGUAGE LambdaCase #-}
{-# LANGUAGE MagicHash #-}
{-# LANGUAGE OverloadedStrings #-}
module GHC.Types.Name.Occurrence (
NameSpace,
tcName, clsName, tcClsName, dataName, varName, fieldName,
tvName, srcDataName,
pprNameSpace, pprNonVarNameSpace, pprNameSpaceBrief,
OccName,
pprOccName, occNameMangledFS,
mkOccName, mkOccNameFS,
mkVarOcc, mkVarOccFS,
mkRecFieldOcc, mkRecFieldOccFS,
mkDataOcc, mkDataOccFS,
mkTyVarOcc, mkTyVarOccFS,
mkTcOcc, mkTcOccFS,
mkClsOcc, mkClsOccFS,
mkDFunOcc,
setOccNameSpace,
demoteOccName,
demoteOccTvName,
promoteOccName,
varToRecFieldOcc,
recFieldToVarOcc,
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,
mkTyConRepOcc,
occNameFS, occNameString, occNameSpace,
isVarOcc, isTvOcc, isTcOcc, isDataOcc, isDataSymOcc, isSymOcc, isValOcc,
isFieldOcc, fieldOcc_maybe,
parenSymOcc, startsWithUnderscore,
isTcClsNameSpace, isTvNameSpace, isDataConNameSpace, isVarNameSpace, isValNameSpace,
isFieldNameSpace, isTermVarOrFieldNameSpace,
OccEnv, emptyOccEnv, unitOccEnv, extendOccEnv,
mapOccEnv, strictMapOccEnv,
mapMaybeOccEnv,
lookupOccEnv, lookupOccEnv_AllNameSpaces,
lookupOccEnv_WithFields, lookupFieldsOccEnv,
mkOccEnv, mkOccEnv_C, extendOccEnvList, elemOccEnv,
nonDetOccEnvElts, nonDetFoldOccEnv,
plusOccEnv, plusOccEnv_C,
extendOccEnv_Acc, filterOccEnv, delListFromOccEnv, delFromOccEnv,
alterOccEnv, minusOccEnv, minusOccEnv_C, minusOccEnv_C_Ns,
pprOccEnv, forceOccEnv,
intersectOccEnv_C,
OccSet, emptyOccSet, unitOccSet, mkOccSet, extendOccSet,
extendOccSetList,
unionOccSets, unionManyOccSets, elemOccSet,
isEmptyOccSet,
mainOcc, ppMainFn,
TidyOccEnv, emptyTidyOccEnv, initTidyOccEnv,
tidyOccName, avoidClashesOccEnv, delTidyOccEnvList,
FastStringEnv, emptyFsEnv, lookupFsEnv, extendFsEnv, mkFsEnv
) where
import GHC.Prelude
import GHC.Builtin.Uniques
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 GHC.Utils.Panic.Plain
import Control.DeepSeq
import Data.Char
import Data.Data
import qualified Data.Semigroup as S
import GHC.Exts( Int(I#), dataToTag# )
data NameSpace
= VarName
| FldName
{ NameSpace -> FastString
fldParent :: !FastString
}
| 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
$c== :: NameSpace -> NameSpace -> Bool
== :: NameSpace -> NameSpace -> Bool
$c/= :: NameSpace -> NameSpace -> Bool
/= :: NameSpace -> NameSpace -> Bool
Eq
instance Ord NameSpace where
compare :: NameSpace -> NameSpace -> Ordering
compare NameSpace
ns1 NameSpace
ns2 =
case Int -> Int -> Ordering
forall a. Ord a => a -> a -> Ordering
compare (Int# -> Int
I# (NameSpace -> Int#
forall a. a -> Int#
dataToTag# NameSpace
ns1)) (Int# -> Int
I# (NameSpace -> Int#
forall a. a -> Int#
dataToTag# NameSpace
ns2)) of
Ordering
LT -> Ordering
LT
Ordering
GT -> Ordering
GT
Ordering
EQ
| FldName { fldParent :: NameSpace -> FastString
fldParent = FastString
p1 } <- NameSpace
ns1
, FldName { fldParent :: NameSpace -> FastString
fldParent = FastString
p2 } <- NameSpace
ns2
-> FastString -> FastString -> Ordering
lexicalCompareFS FastString
p1 FastString
p2
| Bool
otherwise
-> Ordering
EQ
instance Uniquable NameSpace where
getUnique :: NameSpace -> Unique
getUnique (FldName FastString
fs) = FastString -> Unique
mkFldNSUnique FastString
fs
getUnique NameSpace
VarName = Unique
varNSUnique
getUnique NameSpace
DataName = Unique
dataNSUnique
getUnique NameSpace
TvName = Unique
tvNSUnique
getUnique NameSpace
TcClsName = Unique
tcNSUnique
instance NFData NameSpace where
rnf :: NameSpace -> ()
rnf NameSpace
VarName = ()
rnf (FldName FastString
par) = FastString -> ()
forall a. NFData a => a -> ()
rnf FastString
par
rnf NameSpace
DataName = ()
rnf NameSpace
TvName = ()
rnf NameSpace
TcClsName = ()
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
fieldName :: FastString -> NameSpace
fieldName :: FastString -> NameSpace
fieldName = FastString -> NameSpace
FldName
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 (FldName {}) = Bool
True
isVarNameSpace NameSpace
_ = Bool
False
isTermVarOrFieldNameSpace :: NameSpace -> Bool
isTermVarOrFieldNameSpace :: NameSpace -> Bool
isTermVarOrFieldNameSpace NameSpace
VarName = Bool
True
isTermVarOrFieldNameSpace (FldName {}) = Bool
True
isTermVarOrFieldNameSpace NameSpace
_ = Bool
False
isValNameSpace :: NameSpace -> Bool
isValNameSpace :: NameSpace -> Bool
isValNameSpace NameSpace
DataName = Bool
True
isValNameSpace NameSpace
VarName = Bool
True
isValNameSpace (FldName {}) = Bool
True
isValNameSpace NameSpace
_ = Bool
False
isFieldNameSpace :: NameSpace -> Bool
isFieldNameSpace :: NameSpace -> Bool
isFieldNameSpace (FldName {}) = Bool
True
isFieldNameSpace NameSpace
_ = Bool
False
pprNameSpace :: NameSpace -> SDoc
pprNameSpace :: NameSpace -> SDoc
pprNameSpace NameSpace
DataName = [Char] -> SDoc
forall doc. IsLine doc => [Char] -> doc
text [Char]
"data constructor"
pprNameSpace NameSpace
VarName = [Char] -> SDoc
forall doc. IsLine doc => [Char] -> doc
text [Char]
"variable"
pprNameSpace NameSpace
TvName = [Char] -> SDoc
forall doc. IsLine doc => [Char] -> doc
text [Char]
"type variable"
pprNameSpace NameSpace
TcClsName = [Char] -> SDoc
forall doc. IsLine doc => [Char] -> doc
text [Char]
"type constructor or class"
pprNameSpace (FldName FastString
p) = [Char] -> SDoc
forall doc. IsLine doc => [Char] -> doc
text [Char]
"record field of" SDoc -> SDoc -> SDoc
forall doc. IsLine doc => doc -> doc -> doc
<+> FastString -> SDoc
forall doc. IsLine doc => FastString -> doc
ftext FastString
p
pprNonVarNameSpace :: NameSpace -> SDoc
pprNonVarNameSpace :: NameSpace -> SDoc
pprNonVarNameSpace NameSpace
VarName = SDoc
forall doc. IsOutput doc => doc
empty
pprNonVarNameSpace NameSpace
ns = NameSpace -> SDoc
pprNameSpace NameSpace
ns
pprNameSpaceBrief :: NameSpace -> SDoc
pprNameSpaceBrief :: NameSpace -> SDoc
pprNameSpaceBrief NameSpace
DataName = Char -> SDoc
forall doc. IsLine doc => Char -> doc
char Char
'd'
pprNameSpaceBrief NameSpace
VarName = Char -> SDoc
forall doc. IsLine doc => Char -> doc
char Char
'v'
pprNameSpaceBrief NameSpace
TvName = [Char] -> SDoc
forall doc. IsLine doc => [Char] -> doc
text [Char]
"tv"
pprNameSpaceBrief NameSpace
TcClsName = [Char] -> SDoc
forall doc. IsLine doc => [Char] -> doc
text [Char]
"tc"
pprNameSpaceBrief (FldName {}) = [Char] -> SDoc
forall doc. IsLine doc => [Char] -> doc
text [Char]
"fld"
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
demoteNameSpace (FldName {}) = Maybe NameSpace
forall a. Maybe a
Nothing
demoteTvNameSpace :: NameSpace -> Maybe NameSpace
demoteTvNameSpace :: NameSpace -> Maybe NameSpace
demoteTvNameSpace NameSpace
TvName = NameSpace -> Maybe NameSpace
forall a. a -> Maybe a
Just NameSpace
VarName
demoteTvNameSpace NameSpace
VarName = Maybe NameSpace
forall a. Maybe a
Nothing
demoteTvNameSpace NameSpace
DataName = Maybe NameSpace
forall a. Maybe a
Nothing
demoteTvNameSpace NameSpace
TcClsName = Maybe NameSpace
forall a. Maybe a
Nothing
demoteTvNameSpace (FldName {}) = Maybe NameSpace
forall a. Maybe a
Nothing
promoteNameSpace :: NameSpace -> Maybe NameSpace
promoteNameSpace :: NameSpace -> Maybe NameSpace
promoteNameSpace NameSpace
DataName = NameSpace -> Maybe NameSpace
forall a. a -> Maybe a
Just NameSpace
TcClsName
promoteNameSpace NameSpace
VarName = NameSpace -> Maybe NameSpace
forall a. a -> Maybe a
Just NameSpace
TvName
promoteNameSpace NameSpace
TcClsName = Maybe NameSpace
forall a. Maybe a
Nothing
promoteNameSpace NameSpace
TvName = Maybe NameSpace
forall a. Maybe a
Nothing
promoteNameSpace (FldName {}) = Maybe NameSpace
forall a. Maybe a
Nothing
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
== FastString
s2 Bool -> Bool -> Bool
&& NameSpace
sp1 NameSpace -> NameSpace -> Bool
forall a. Eq a => a -> a -> Bool
== NameSpace
sp2
instance Ord OccName where
compare :: OccName -> OccName -> Ordering
compare (OccName NameSpace
sp1 FastString
s1) (OccName NameSpace
sp2 FastString
s2) =
FastString -> FastString -> Ordering
lexicalCompareFS FastString
s1 FastString
s2 Ordering -> Ordering -> Ordering
forall a. Semigroup a => a -> a -> a
S.<> NameSpace -> NameSpace -> Ordering
forall a. Ord a => a -> a -> Ordering
compare NameSpace
sp1 NameSpace
sp2
instance Data OccName where
toConstr :: OccName -> Constr
toConstr OccName
_ = [Char] -> Constr
abstractConstr [Char]
"OccName"
gunfold :: forall (c :: * -> *).
(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 -> () -> ()
forall a b. a -> b -> b
`seq` ()
instance Outputable OccName where
ppr :: OccName -> SDoc
ppr = OccName -> SDoc
forall doc. IsLine doc => OccName -> doc
pprOccName
instance OutputableBndr OccName where
pprBndr :: BindingSite -> OccName -> SDoc
pprBndr BindingSite
_ = OccName -> SDoc
forall a. Outputable a => a -> SDoc
ppr
pprInfixOcc :: OccName -> SDoc
pprInfixOcc OccName
n = Bool -> SDoc -> SDoc
pprInfixVar (OccName -> Bool
isSymOcc OccName
n) (OccName -> SDoc
forall a. Outputable a => a -> SDoc
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
ppr OccName
n)
pprOccName :: IsLine doc => OccName -> doc
pprOccName :: forall doc. IsLine doc => OccName -> doc
pprOccName (OccName NameSpace
sp FastString
occ)
= doc -> (PprStyle -> SDoc) -> doc
forall doc. IsOutput doc => doc -> (PprStyle -> SDoc) -> doc
docWithStyle (FastZString -> doc
forall doc. IsLine doc => FastZString -> doc
ztext (FastString -> FastZString
zEncodeFS FastString
occ))
(\PprStyle
_ -> FastString -> SDoc
forall doc. IsLine doc => FastString -> doc
ftext FastString
occ SDoc -> SDoc -> SDoc
forall doc. IsLine doc => doc -> doc -> doc
<> SDoc -> SDoc
forall doc. IsOutput doc => doc -> doc
whenPprDebug (SDoc -> SDoc
forall doc. IsLine doc => doc -> doc
braces (NameSpace -> SDoc
pprNameSpaceBrief NameSpace
sp)))
{-# SPECIALIZE pprOccName :: OccName -> SDoc #-}
{-# SPECIALIZE pprOccName :: OccName -> HLine #-}
occNameMangledFS :: OccName -> FastString
occNameMangledFS :: OccName -> FastString
occNameMangledFS (OccName NameSpace
ns FastString
fs) =
case NameSpace
ns of
FldName FastString
con -> [FastString] -> FastString
concatFS [[Char] -> FastString
fsLit [Char]
"$fld:", FastString
con, FastString
":", FastString
fs]
NameSpace
_ -> FastString
fs
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
mkRecFieldOcc :: FastString -> String -> OccName
mkRecFieldOcc :: FastString -> [Char] -> OccName
mkRecFieldOcc FastString
dc = NameSpace -> [Char] -> OccName
mkOccName (FastString -> NameSpace
fieldName FastString
dc)
mkRecFieldOccFS :: FastString -> FastString -> OccName
mkRecFieldOccFS :: FastString -> FastString -> OccName
mkRecFieldOccFS FastString
dc = NameSpace -> FastString -> OccName
mkOccNameFS (FastString -> NameSpace
fieldName FastString
dc)
varToRecFieldOcc :: HasDebugCallStack => FastString -> OccName -> OccName
varToRecFieldOcc :: HasDebugCallStack => FastString -> OccName -> OccName
varToRecFieldOcc FastString
dc (OccName NameSpace
ns FastString
s) =
Bool -> OccName -> OccName
forall a. HasCallStack => Bool -> a -> a
assert Bool
makes_sense (OccName -> OccName) -> OccName -> OccName
forall a b. (a -> b) -> a -> b
$ FastString -> FastString -> OccName
mkRecFieldOccFS FastString
dc FastString
s
where
makes_sense :: Bool
makes_sense = case NameSpace
ns of
NameSpace
VarName -> Bool
True
FldName {} -> Bool
True
NameSpace
_ -> Bool
False
recFieldToVarOcc :: HasDebugCallStack => OccName -> OccName
recFieldToVarOcc :: HasDebugCallStack => OccName -> OccName
recFieldToVarOcc (OccName NameSpace
_ns FastString
s) = FastString -> OccName
mkVarOccFS FastString
s
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 a. a -> Maybe a
forall (m :: * -> *) a. Monad m => a -> m a
return (OccName -> Maybe OccName) -> OccName -> Maybe OccName
forall a b. (a -> b) -> a -> b
$ NameSpace -> FastString -> OccName
OccName NameSpace
space' FastString
name
demoteOccTvName :: OccName -> Maybe OccName
demoteOccTvName :: OccName -> Maybe OccName
demoteOccTvName (OccName NameSpace
space FastString
name) = do
NameSpace
space' <- NameSpace -> Maybe NameSpace
demoteTvNameSpace NameSpace
space
OccName -> Maybe OccName
forall a. a -> Maybe a
forall (m :: * -> *) a. Monad m => a -> m a
return (OccName -> Maybe OccName) -> OccName -> Maybe OccName
forall a b. (a -> b) -> a -> b
$ NameSpace -> FastString -> OccName
OccName NameSpace
space' FastString
name
promoteOccName :: OccName -> Maybe OccName
promoteOccName :: OccName -> Maybe OccName
promoteOccName (OccName NameSpace
space FastString
name) = do
NameSpace
space' <- NameSpace -> Maybe NameSpace
promoteNameSpace NameSpace
space
OccName -> Maybe OccName
forall a. a -> Maybe a
forall (m :: * -> *) a. Monad m => a -> m a
return (OccName -> Maybe OccName) -> OccName -> Maybe OccName
forall a b. (a -> b) -> a -> b
$ NameSpace -> FastString -> OccName
OccName NameSpace
space' FastString
name
class HasOccName name where
occName :: name -> OccName
newtype OccEnv a = MkOccEnv (FastStringEnv (UniqFM NameSpace a))
deriving (forall a b. (a -> b) -> OccEnv a -> OccEnv b)
-> (forall a b. a -> OccEnv b -> OccEnv a) -> Functor OccEnv
forall a b. a -> OccEnv b -> OccEnv a
forall a b. (a -> b) -> OccEnv a -> OccEnv b
forall (f :: * -> *).
(forall a b. (a -> b) -> f a -> f b)
-> (forall a b. a -> f b -> f a) -> Functor f
$cfmap :: forall a b. (a -> b) -> OccEnv a -> OccEnv b
fmap :: forall a b. (a -> b) -> OccEnv a -> OccEnv b
$c<$ :: forall a b. a -> OccEnv b -> OccEnv a
<$ :: forall a b. a -> OccEnv b -> OccEnv a
Functor
emptyOccEnv :: OccEnv a
emptyOccEnv :: forall a. OccEnv a
emptyOccEnv = FastStringEnv (UniqFM NameSpace a) -> OccEnv a
forall a. FastStringEnv (UniqFM NameSpace a) -> OccEnv a
MkOccEnv FastStringEnv (UniqFM NameSpace a)
forall a. FastStringEnv a
emptyFsEnv
unitOccEnv :: OccName -> a -> OccEnv a
unitOccEnv :: forall a. OccName -> a -> OccEnv a
unitOccEnv (OccName NameSpace
ns FastString
s) a
a = FastStringEnv (UniqFM NameSpace a) -> OccEnv a
forall a. FastStringEnv (UniqFM NameSpace a) -> OccEnv a
MkOccEnv (FastStringEnv (UniqFM NameSpace a) -> OccEnv a)
-> FastStringEnv (UniqFM NameSpace a) -> OccEnv a
forall a b. (a -> b) -> a -> b
$ FastString
-> UniqFM NameSpace a -> FastStringEnv (UniqFM NameSpace a)
forall a. FastString -> a -> FastStringEnv a
unitFsEnv FastString
s (NameSpace -> a -> UniqFM NameSpace a
forall key elt. Uniquable key => key -> elt -> UniqFM key elt
unitUFM NameSpace
ns a
a)
extendOccEnv :: OccEnv a -> OccName -> a -> OccEnv a
extendOccEnv :: forall a. OccEnv a -> OccName -> a -> OccEnv a
extendOccEnv (MkOccEnv FastStringEnv (UniqFM NameSpace a)
as) (OccName NameSpace
ns FastString
s) a
a =
FastStringEnv (UniqFM NameSpace a) -> OccEnv a
forall a. FastStringEnv (UniqFM NameSpace a) -> OccEnv a
MkOccEnv (FastStringEnv (UniqFM NameSpace a) -> OccEnv a)
-> FastStringEnv (UniqFM NameSpace a) -> OccEnv a
forall a b. (a -> b) -> a -> b
$ (UniqFM NameSpace a -> UniqFM NameSpace a -> UniqFM NameSpace a)
-> FastStringEnv (UniqFM NameSpace a)
-> FastString
-> UniqFM NameSpace a
-> FastStringEnv (UniqFM NameSpace a)
forall a.
(a -> a -> a)
-> FastStringEnv a -> FastString -> a -> FastStringEnv a
extendFsEnv_C UniqFM NameSpace a -> UniqFM NameSpace a -> UniqFM NameSpace a
forall key elt. UniqFM key elt -> UniqFM key elt -> UniqFM key elt
plusUFM FastStringEnv (UniqFM NameSpace a)
as FastString
s (NameSpace -> a -> UniqFM NameSpace a
forall key elt. Uniquable key => key -> elt -> UniqFM key elt
unitUFM NameSpace
ns a
a)
extendOccEnvList :: OccEnv a -> [(OccName, a)] -> OccEnv a
extendOccEnvList :: forall a. OccEnv a -> [(OccName, a)] -> OccEnv a
extendOccEnvList = (OccEnv a -> (OccName, a) -> OccEnv a)
-> OccEnv a -> [(OccName, a)] -> OccEnv a
forall b a. (b -> a -> b) -> b -> [a] -> b
forall (t :: * -> *) b a.
Foldable t =>
(b -> a -> b) -> b -> t a -> b
foldl' ((OccEnv a -> (OccName, a) -> OccEnv a)
-> OccEnv a -> [(OccName, a)] -> OccEnv a)
-> (OccEnv a -> (OccName, a) -> OccEnv a)
-> OccEnv a
-> [(OccName, a)]
-> OccEnv a
forall a b. (a -> b) -> a -> b
$ \ OccEnv a
env (OccName
occ, a
a) -> OccEnv a -> OccName -> a -> OccEnv a
forall a. OccEnv a -> OccName -> a -> OccEnv a
extendOccEnv OccEnv a
env OccName
occ a
a
lookupOccEnv :: OccEnv a -> OccName -> Maybe a
lookupOccEnv :: forall a. OccEnv a -> OccName -> Maybe a
lookupOccEnv (MkOccEnv FastStringEnv (UniqFM NameSpace a)
as) (OccName NameSpace
ns FastString
s)
= do { UniqFM NameSpace a
m <- FastStringEnv (UniqFM NameSpace a)
-> FastString -> Maybe (UniqFM NameSpace a)
forall a. FastStringEnv a -> FastString -> Maybe a
lookupFsEnv FastStringEnv (UniqFM NameSpace a)
as FastString
s
; UniqFM NameSpace a -> NameSpace -> Maybe a
forall key elt. Uniquable key => UniqFM key elt -> key -> Maybe elt
lookupUFM UniqFM NameSpace a
m NameSpace
ns }
lookupOccEnv_AllNameSpaces :: OccEnv a -> OccName -> [a]
lookupOccEnv_AllNameSpaces :: forall a. OccEnv a -> OccName -> [a]
lookupOccEnv_AllNameSpaces (MkOccEnv FastStringEnv (UniqFM NameSpace a)
as) (OccName NameSpace
_ FastString
s)
= case FastStringEnv (UniqFM NameSpace a)
-> FastString -> Maybe (UniqFM NameSpace a)
forall a. FastStringEnv a -> FastString -> Maybe a
lookupFsEnv FastStringEnv (UniqFM NameSpace a)
as FastString
s of
Maybe (UniqFM NameSpace a)
Nothing -> []
Just UniqFM NameSpace a
r -> UniqFM NameSpace a -> [a]
forall key elt. UniqFM key elt -> [elt]
nonDetEltsUFM UniqFM NameSpace a
r
lookupOccEnv_WithFields :: OccEnv a -> OccName -> [a]
lookupOccEnv_WithFields :: forall a. OccEnv a -> OccName -> [a]
lookupOccEnv_WithFields OccEnv a
env OccName
occ =
case OccEnv a -> OccName -> Maybe a
forall a. OccEnv a -> OccName -> Maybe a
lookupOccEnv OccEnv a
env OccName
occ of
Maybe a
Nothing -> [a]
fieldGREs
Just a
gre -> a
gre a -> [a] -> [a]
forall a. a -> [a] -> [a]
: [a]
fieldGREs
where
fieldGREs :: [a]
fieldGREs
| OccName -> Bool
isVarOcc OccName
occ
= OccEnv a -> FastString -> [a]
forall a. OccEnv a -> FastString -> [a]
lookupFieldsOccEnv OccEnv a
env (OccName -> FastString
occNameFS OccName
occ)
| Bool
otherwise
= []
lookupFieldsOccEnv :: OccEnv a -> FastString -> [a]
lookupFieldsOccEnv :: forall a. OccEnv a -> FastString -> [a]
lookupFieldsOccEnv (MkOccEnv FastStringEnv (UniqFM NameSpace a)
as) FastString
fld =
case FastStringEnv (UniqFM NameSpace a)
-> FastString -> Maybe (UniqFM NameSpace a)
forall a. FastStringEnv a -> FastString -> Maybe a
lookupFsEnv FastStringEnv (UniqFM NameSpace a)
as FastString
fld of
Maybe (UniqFM NameSpace a)
Nothing -> []
Just UniqFM NameSpace a
flds -> UniqFM NameSpace a -> [a]
forall key elt. UniqFM key elt -> [elt]
nonDetEltsUFM (UniqFM NameSpace a -> [a]) -> UniqFM NameSpace a -> [a]
forall a b. (a -> b) -> a -> b
$ UniqFM NameSpace a -> UniqFM NameSpace a
forall {key} {elt}. UniqFM key elt -> UniqFM key elt
filter_flds UniqFM NameSpace a
flds
where
filter_flds :: UniqFM key elt -> UniqFM key elt
filter_flds = (Unique -> elt -> Bool) -> UniqFM key elt -> UniqFM key elt
forall elt key.
(Unique -> elt -> Bool) -> UniqFM key elt -> UniqFM key elt
filterUFM_Directly (\ Unique
uniq elt
_ -> Unique -> Bool
isFldNSUnique Unique
uniq)
mkOccEnv :: [(OccName,a)] -> OccEnv a
mkOccEnv :: forall a. [(OccName, a)] -> OccEnv a
mkOccEnv = OccEnv a -> [(OccName, a)] -> OccEnv a
forall a. OccEnv a -> [(OccName, a)] -> OccEnv a
extendOccEnvList OccEnv a
forall a. OccEnv a
emptyOccEnv
mkOccEnv_C :: (a -> a -> a)
-> [(OccName,a)]
-> OccEnv a
mkOccEnv_C :: forall a. (a -> a -> a) -> [(OccName, a)] -> OccEnv a
mkOccEnv_C a -> a -> a
f [(OccName, a)]
elts
= FastStringEnv (UniqFM NameSpace a) -> OccEnv a
forall a. FastStringEnv (UniqFM NameSpace a) -> OccEnv a
MkOccEnv (FastStringEnv (UniqFM NameSpace a) -> OccEnv a)
-> FastStringEnv (UniqFM NameSpace a) -> OccEnv a
forall a b. (a -> b) -> a -> b
$ (FastStringEnv (UniqFM NameSpace a)
-> (OccName, a) -> FastStringEnv (UniqFM NameSpace a))
-> FastStringEnv (UniqFM NameSpace a)
-> [(OccName, a)]
-> FastStringEnv (UniqFM NameSpace a)
forall b a. (b -> a -> b) -> b -> [a] -> b
forall (t :: * -> *) b a.
Foldable t =>
(b -> a -> b) -> b -> t a -> b
foldl' FastStringEnv (UniqFM NameSpace a)
-> (OccName, a) -> FastStringEnv (UniqFM NameSpace a)
g FastStringEnv (UniqFM NameSpace a)
forall a. FastStringEnv a
emptyFsEnv [(OccName, a)]
elts
where
g :: FastStringEnv (UniqFM NameSpace a)
-> (OccName, a) -> FastStringEnv (UniqFM NameSpace a)
g FastStringEnv (UniqFM NameSpace a)
env (OccName NameSpace
ns FastString
s, a
a) =
(UniqFM NameSpace a -> UniqFM NameSpace a -> UniqFM NameSpace a)
-> FastStringEnv (UniqFM NameSpace a)
-> FastString
-> UniqFM NameSpace a
-> FastStringEnv (UniqFM NameSpace a)
forall a.
(a -> a -> a)
-> FastStringEnv a -> FastString -> a -> FastStringEnv a
extendFsEnv_C ((a -> a -> a)
-> UniqFM NameSpace a -> UniqFM NameSpace a -> UniqFM NameSpace a
forall elt key.
(elt -> elt -> elt)
-> UniqFM key elt -> UniqFM key elt -> UniqFM key elt
plusUFM_C ((a -> a -> a)
-> UniqFM NameSpace a -> UniqFM NameSpace a -> UniqFM NameSpace a)
-> (a -> a -> a)
-> UniqFM NameSpace a
-> UniqFM NameSpace a
-> UniqFM NameSpace a
forall a b. (a -> b) -> a -> b
$ (a -> a -> a) -> a -> a -> a
forall a b c. (a -> b -> c) -> b -> a -> c
flip a -> a -> a
f) FastStringEnv (UniqFM NameSpace a)
env FastString
s (NameSpace -> a -> UniqFM NameSpace a
forall key elt. Uniquable key => key -> elt -> UniqFM key elt
unitUFM NameSpace
ns a
a)
elemOccEnv :: OccName -> OccEnv a -> Bool
elemOccEnv :: forall a. OccName -> OccEnv a -> Bool
elemOccEnv (OccName NameSpace
ns FastString
s) (MkOccEnv FastStringEnv (UniqFM NameSpace a)
as)
= case FastStringEnv (UniqFM NameSpace a)
-> FastString -> Maybe (UniqFM NameSpace a)
forall a. FastStringEnv a -> FastString -> Maybe a
lookupFsEnv FastStringEnv (UniqFM NameSpace a)
as FastString
s of
Maybe (UniqFM NameSpace a)
Nothing -> Bool
False
Just UniqFM NameSpace a
m -> NameSpace
ns NameSpace -> UniqFM NameSpace a -> Bool
forall key elt. Uniquable key => key -> UniqFM key elt -> Bool
`elemUFM` UniqFM NameSpace a
m
nonDetFoldOccEnv :: (a -> b -> b) -> b -> OccEnv a -> b
nonDetFoldOccEnv :: forall a b. (a -> b -> b) -> b -> OccEnv a -> b
nonDetFoldOccEnv a -> b -> b
f b
b0 (MkOccEnv FastStringEnv (UniqFM NameSpace a)
as) =
(UniqFM NameSpace a -> b -> b)
-> b -> FastStringEnv (UniqFM NameSpace a) -> b
forall a b. (a -> b -> b) -> b -> FastStringEnv a -> b
nonDetFoldFsEnv ((b -> UniqFM NameSpace a -> b) -> UniqFM NameSpace a -> b -> b
forall a b c. (a -> b -> c) -> b -> a -> c
flip ((b -> UniqFM NameSpace a -> b) -> UniqFM NameSpace a -> b -> b)
-> (b -> UniqFM NameSpace a -> b) -> UniqFM NameSpace a -> b -> b
forall a b. (a -> b) -> a -> b
$ (a -> b -> b) -> b -> UniqFM NameSpace a -> b
forall elt a key. (elt -> a -> a) -> a -> UniqFM key elt -> a
nonDetFoldUFM a -> b -> b
f) b
b0 FastStringEnv (UniqFM NameSpace a)
as
nonDetOccEnvElts :: OccEnv a -> [a]
nonDetOccEnvElts :: forall a. OccEnv a -> [a]
nonDetOccEnvElts = (a -> [a] -> [a]) -> [a] -> OccEnv a -> [a]
forall a b. (a -> b -> b) -> b -> OccEnv a -> b
nonDetFoldOccEnv (:) []
plusOccEnv :: OccEnv a -> OccEnv a -> OccEnv a
plusOccEnv :: forall a. OccEnv a -> OccEnv a -> OccEnv a
plusOccEnv (MkOccEnv FastStringEnv (UniqFM NameSpace a)
env1) (MkOccEnv FastStringEnv (UniqFM NameSpace a)
env2)
= FastStringEnv (UniqFM NameSpace a) -> OccEnv a
forall a. FastStringEnv (UniqFM NameSpace a) -> OccEnv a
MkOccEnv (FastStringEnv (UniqFM NameSpace a) -> OccEnv a)
-> FastStringEnv (UniqFM NameSpace a) -> OccEnv a
forall a b. (a -> b) -> a -> b
$ (UniqFM NameSpace a -> UniqFM NameSpace a -> UniqFM NameSpace a)
-> FastStringEnv (UniqFM NameSpace a)
-> FastStringEnv (UniqFM NameSpace a)
-> FastStringEnv (UniqFM NameSpace a)
forall a.
(a -> a -> a)
-> FastStringEnv a -> FastStringEnv a -> FastStringEnv a
plusFsEnv_C UniqFM NameSpace a -> UniqFM NameSpace a -> UniqFM NameSpace a
forall key elt. UniqFM key elt -> UniqFM key elt -> UniqFM key elt
plusUFM FastStringEnv (UniqFM NameSpace a)
env1 FastStringEnv (UniqFM NameSpace a)
env2
plusOccEnv_C :: (a->a->a) -> OccEnv a -> OccEnv a -> OccEnv a
plusOccEnv_C :: forall a. (a -> a -> a) -> OccEnv a -> OccEnv a -> OccEnv a
plusOccEnv_C a -> a -> a
f (MkOccEnv FastStringEnv (UniqFM NameSpace a)
env1) (MkOccEnv FastStringEnv (UniqFM NameSpace a)
env2)
= FastStringEnv (UniqFM NameSpace a) -> OccEnv a
forall a. FastStringEnv (UniqFM NameSpace a) -> OccEnv a
MkOccEnv (FastStringEnv (UniqFM NameSpace a) -> OccEnv a)
-> FastStringEnv (UniqFM NameSpace a) -> OccEnv a
forall a b. (a -> b) -> a -> b
$ (UniqFM NameSpace a -> UniqFM NameSpace a -> UniqFM NameSpace a)
-> FastStringEnv (UniqFM NameSpace a)
-> FastStringEnv (UniqFM NameSpace a)
-> FastStringEnv (UniqFM NameSpace a)
forall a.
(a -> a -> a)
-> FastStringEnv a -> FastStringEnv a -> FastStringEnv a
plusFsEnv_C ((a -> a -> a)
-> UniqFM NameSpace a -> UniqFM NameSpace a -> UniqFM NameSpace a
forall elt key.
(elt -> elt -> elt)
-> UniqFM key elt -> UniqFM key elt -> UniqFM key elt
plusUFM_C a -> a -> a
f) FastStringEnv (UniqFM NameSpace a)
env1 FastStringEnv (UniqFM NameSpace a)
env2
mapOccEnv :: (a->b) -> OccEnv a -> OccEnv b
mapOccEnv :: forall a b. (a -> b) -> OccEnv a -> OccEnv b
mapOccEnv = (a -> b) -> OccEnv a -> OccEnv b
forall a b. (a -> b) -> OccEnv a -> OccEnv b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap
mapMaybeOccEnv :: (a -> Maybe b) -> OccEnv a -> OccEnv b
mapMaybeOccEnv :: forall a b. (a -> Maybe b) -> OccEnv a -> OccEnv b
mapMaybeOccEnv a -> Maybe b
f (MkOccEnv FastStringEnv (UniqFM NameSpace a)
env)
= FastStringEnv (UniqFM NameSpace b) -> OccEnv b
forall a. FastStringEnv (UniqFM NameSpace a) -> OccEnv a
MkOccEnv (FastStringEnv (UniqFM NameSpace b) -> OccEnv b)
-> FastStringEnv (UniqFM NameSpace b) -> OccEnv b
forall a b. (a -> b) -> a -> b
$ (UniqFM NameSpace a -> Maybe (UniqFM NameSpace b))
-> FastStringEnv (UniqFM NameSpace a)
-> FastStringEnv (UniqFM NameSpace b)
forall elt1 elt2 key.
(elt1 -> Maybe elt2) -> UniqFM key elt1 -> UniqFM key elt2
mapMaybeUFM UniqFM NameSpace a -> Maybe (UniqFM NameSpace b)
g FastStringEnv (UniqFM NameSpace a)
env
where
g :: UniqFM NameSpace a -> Maybe (UniqFM NameSpace b)
g UniqFM NameSpace a
as =
case (a -> Maybe b) -> UniqFM NameSpace a -> UniqFM NameSpace b
forall elt1 elt2 key.
(elt1 -> Maybe elt2) -> UniqFM key elt1 -> UniqFM key elt2
mapMaybeUFM a -> Maybe b
f UniqFM NameSpace a
as of
UniqFM NameSpace b
m' | UniqFM NameSpace b -> Bool
forall key elt. UniqFM key elt -> Bool
isNullUFM UniqFM NameSpace b
m' -> Maybe (UniqFM NameSpace b)
forall a. Maybe a
Nothing
| Bool
otherwise -> UniqFM NameSpace b -> Maybe (UniqFM NameSpace b)
forall a. a -> Maybe a
Just UniqFM NameSpace b
m'
extendOccEnv_Acc :: forall a b
. (a->b->b)
-> (a->b)
-> OccEnv b
-> OccName -> a
-> OccEnv b
extendOccEnv_Acc :: forall a b.
(a -> b -> b) -> (a -> b) -> OccEnv b -> OccName -> a -> OccEnv b
extendOccEnv_Acc a -> b -> b
f a -> b
g (MkOccEnv FastStringEnv (UniqFM NameSpace b)
env) (OccName NameSpace
ns FastString
s) =
FastStringEnv (UniqFM NameSpace b) -> OccEnv b
forall a. FastStringEnv (UniqFM NameSpace a) -> OccEnv a
MkOccEnv (FastStringEnv (UniqFM NameSpace b) -> OccEnv b)
-> (a -> FastStringEnv (UniqFM NameSpace b)) -> a -> OccEnv b
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (a -> UniqFM NameSpace b -> UniqFM NameSpace b)
-> (a -> UniqFM NameSpace b)
-> FastStringEnv (UniqFM NameSpace b)
-> FastString
-> a
-> FastStringEnv (UniqFM NameSpace b)
forall a b.
(a -> b -> b)
-> (a -> b)
-> FastStringEnv b
-> FastString
-> a
-> FastStringEnv b
extendFsEnv_Acc a -> UniqFM NameSpace b -> UniqFM NameSpace b
f' a -> UniqFM NameSpace b
g' FastStringEnv (UniqFM NameSpace b)
env FastString
s
where
f' :: a -> UniqFM NameSpace b -> UniqFM NameSpace b
f' :: a -> UniqFM NameSpace b -> UniqFM NameSpace b
f' a
a UniqFM NameSpace b
bs = (Maybe b -> Maybe b)
-> UniqFM NameSpace b -> NameSpace -> UniqFM NameSpace b
forall key elt.
Uniquable key =>
(Maybe elt -> Maybe elt) -> UniqFM key elt -> key -> UniqFM key elt
alterUFM (b -> Maybe b
forall a. a -> Maybe a
Just (b -> Maybe b) -> (Maybe b -> b) -> Maybe b -> Maybe b
forall b c a. (b -> c) -> (a -> b) -> a -> c
. \ case { Maybe b
Nothing -> a -> b
g a
a ; Just b
b -> a -> b -> b
f a
a b
b }) UniqFM NameSpace b
bs NameSpace
ns
g' :: a -> UniqFM NameSpace b
g' a
a = NameSpace -> b -> UniqFM NameSpace b
forall key elt. Uniquable key => key -> elt -> UniqFM key elt
unitUFM NameSpace
ns (a -> b
g a
a)
delFromOccEnv :: forall a. OccEnv a -> OccName -> OccEnv a
delFromOccEnv :: forall a. OccEnv a -> OccName -> OccEnv a
delFromOccEnv (MkOccEnv FastStringEnv (UniqFM NameSpace a)
env1) (OccName NameSpace
ns FastString
s) =
FastStringEnv (UniqFM NameSpace a) -> OccEnv a
forall a. FastStringEnv (UniqFM NameSpace a) -> OccEnv a
MkOccEnv (FastStringEnv (UniqFM NameSpace a) -> OccEnv a)
-> FastStringEnv (UniqFM NameSpace a) -> OccEnv a
forall a b. (a -> b) -> a -> b
$ (Maybe (UniqFM NameSpace a) -> Maybe (UniqFM NameSpace a))
-> FastStringEnv (UniqFM NameSpace a)
-> FastString
-> FastStringEnv (UniqFM NameSpace a)
forall a.
(Maybe a -> Maybe a)
-> FastStringEnv a -> FastString -> FastStringEnv a
alterFsEnv Maybe (UniqFM NameSpace a) -> Maybe (UniqFM NameSpace a)
f FastStringEnv (UniqFM NameSpace a)
env1 FastString
s
where
f :: Maybe (UniqFM NameSpace a) -> Maybe (UniqFM NameSpace a)
f :: Maybe (UniqFM NameSpace a) -> Maybe (UniqFM NameSpace a)
f Maybe (UniqFM NameSpace a)
Nothing = Maybe (UniqFM NameSpace a)
forall a. Maybe a
Nothing
f (Just UniqFM NameSpace a
m) =
case UniqFM NameSpace a -> NameSpace -> UniqFM NameSpace a
forall key elt.
Uniquable key =>
UniqFM key elt -> key -> UniqFM key elt
delFromUFM UniqFM NameSpace a
m NameSpace
ns of
UniqFM NameSpace a
m' | UniqFM NameSpace a -> Bool
forall key elt. UniqFM key elt -> Bool
isNullUFM UniqFM NameSpace a
m' -> Maybe (UniqFM NameSpace a)
forall a. Maybe a
Nothing
| Bool
otherwise -> UniqFM NameSpace a -> Maybe (UniqFM NameSpace a)
forall a. a -> Maybe a
Just UniqFM NameSpace a
m'
delListFromOccEnv :: OccEnv a -> [OccName] -> OccEnv a
delListFromOccEnv :: forall a. OccEnv a -> [OccName] -> OccEnv a
delListFromOccEnv = (OccEnv a -> OccName -> OccEnv a)
-> OccEnv a -> [OccName] -> OccEnv a
forall b a. (b -> a -> b) -> b -> [a] -> b
forall (t :: * -> *) b a.
Foldable t =>
(b -> a -> b) -> b -> t a -> b
foldl' OccEnv a -> OccName -> OccEnv a
forall a. OccEnv a -> OccName -> OccEnv a
delFromOccEnv
filterOccEnv :: forall a. (a -> Bool) -> OccEnv a -> OccEnv a
filterOccEnv :: forall a. (a -> Bool) -> OccEnv a -> OccEnv a
filterOccEnv a -> Bool
f (MkOccEnv FastStringEnv (UniqFM NameSpace a)
env) =
FastStringEnv (UniqFM NameSpace a) -> OccEnv a
forall a. FastStringEnv (UniqFM NameSpace a) -> OccEnv a
MkOccEnv (FastStringEnv (UniqFM NameSpace a) -> OccEnv a)
-> FastStringEnv (UniqFM NameSpace a) -> OccEnv a
forall a b. (a -> b) -> a -> b
$ (UniqFM NameSpace a -> Maybe (UniqFM NameSpace a))
-> FastStringEnv (UniqFM NameSpace a)
-> FastStringEnv (UniqFM NameSpace a)
forall elt1 elt2.
(elt1 -> Maybe elt2) -> FastStringEnv elt1 -> FastStringEnv elt2
mapMaybeFsEnv UniqFM NameSpace a -> Maybe (UniqFM NameSpace a)
g FastStringEnv (UniqFM NameSpace a)
env
where
g :: UniqFM NameSpace a -> Maybe (UniqFM NameSpace a)
g :: UniqFM NameSpace a -> Maybe (UniqFM NameSpace a)
g UniqFM NameSpace a
ms =
case (a -> Bool) -> UniqFM NameSpace a -> UniqFM NameSpace a
forall elt key. (elt -> Bool) -> UniqFM key elt -> UniqFM key elt
filterUFM a -> Bool
f UniqFM NameSpace a
ms of
UniqFM NameSpace a
m' | UniqFM NameSpace a -> Bool
forall key elt. UniqFM key elt -> Bool
isNullUFM UniqFM NameSpace a
m' -> Maybe (UniqFM NameSpace a)
forall a. Maybe a
Nothing
| Bool
otherwise -> UniqFM NameSpace a -> Maybe (UniqFM NameSpace a)
forall a. a -> Maybe a
Just UniqFM NameSpace a
m'
alterOccEnv :: forall a. (Maybe a -> Maybe a) -> OccEnv a -> OccName -> OccEnv a
alterOccEnv :: forall a. (Maybe a -> Maybe a) -> OccEnv a -> OccName -> OccEnv a
alterOccEnv Maybe a -> Maybe a
f (MkOccEnv FastStringEnv (UniqFM NameSpace a)
env) (OccName NameSpace
ns FastString
s) =
FastStringEnv (UniqFM NameSpace a) -> OccEnv a
forall a. FastStringEnv (UniqFM NameSpace a) -> OccEnv a
MkOccEnv (FastStringEnv (UniqFM NameSpace a) -> OccEnv a)
-> FastStringEnv (UniqFM NameSpace a) -> OccEnv a
forall a b. (a -> b) -> a -> b
$ (Maybe (UniqFM NameSpace a) -> Maybe (UniqFM NameSpace a))
-> FastStringEnv (UniqFM NameSpace a)
-> FastString
-> FastStringEnv (UniqFM NameSpace a)
forall a.
(Maybe a -> Maybe a)
-> FastStringEnv a -> FastString -> FastStringEnv a
alterFsEnv Maybe (UniqFM NameSpace a) -> Maybe (UniqFM NameSpace a)
g FastStringEnv (UniqFM NameSpace a)
env FastString
s
where
g :: Maybe (UniqFM NameSpace a) -> Maybe (UniqFM NameSpace a)
g :: Maybe (UniqFM NameSpace a) -> Maybe (UniqFM NameSpace a)
g Maybe (UniqFM NameSpace a)
Nothing = (a -> UniqFM NameSpace a) -> Maybe a -> Maybe (UniqFM NameSpace a)
forall a b. (a -> b) -> Maybe a -> Maybe b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (NameSpace -> a -> UniqFM NameSpace a
forall key elt. Uniquable key => key -> elt -> UniqFM key elt
unitUFM NameSpace
ns) (Maybe a -> Maybe a
f Maybe a
forall a. Maybe a
Nothing)
g (Just UniqFM NameSpace a
m) =
case (Maybe a -> Maybe a)
-> UniqFM NameSpace a -> NameSpace -> UniqFM NameSpace a
forall key elt.
Uniquable key =>
(Maybe elt -> Maybe elt) -> UniqFM key elt -> key -> UniqFM key elt
alterUFM Maybe a -> Maybe a
f UniqFM NameSpace a
m NameSpace
ns of
UniqFM NameSpace a
m' | UniqFM NameSpace a -> Bool
forall key elt. UniqFM key elt -> Bool
isNullUFM UniqFM NameSpace a
m' -> Maybe (UniqFM NameSpace a)
forall a. Maybe a
Nothing
| Bool
otherwise -> UniqFM NameSpace a -> Maybe (UniqFM NameSpace a)
forall a. a -> Maybe a
Just UniqFM NameSpace a
m'
intersectOccEnv_C :: (a -> b -> c) -> OccEnv a -> OccEnv b -> OccEnv c
intersectOccEnv_C :: forall a b c. (a -> b -> c) -> OccEnv a -> OccEnv b -> OccEnv c
intersectOccEnv_C a -> b -> c
f (MkOccEnv FastStringEnv (UniqFM NameSpace a)
as) (MkOccEnv FastStringEnv (UniqFM NameSpace b)
bs)
= FastStringEnv (UniqFM NameSpace c) -> OccEnv c
forall a. FastStringEnv (UniqFM NameSpace a) -> OccEnv a
MkOccEnv (FastStringEnv (UniqFM NameSpace c) -> OccEnv c)
-> FastStringEnv (UniqFM NameSpace c) -> OccEnv c
forall a b. (a -> b) -> a -> b
$ (UniqFM NameSpace a -> UniqFM NameSpace b -> UniqFM NameSpace c)
-> FastStringEnv (UniqFM NameSpace a)
-> FastStringEnv (UniqFM NameSpace b)
-> FastStringEnv (UniqFM NameSpace c)
forall elt1 elt2 elt3 key.
(elt1 -> elt2 -> elt3)
-> UniqFM key elt1 -> UniqFM key elt2 -> UniqFM key elt3
intersectUFM_C ((a -> b -> c)
-> UniqFM NameSpace a -> UniqFM NameSpace b -> UniqFM NameSpace c
forall elt1 elt2 elt3 key.
(elt1 -> elt2 -> elt3)
-> UniqFM key elt1 -> UniqFM key elt2 -> UniqFM key elt3
intersectUFM_C a -> b -> c
f) FastStringEnv (UniqFM NameSpace a)
as FastStringEnv (UniqFM NameSpace b)
bs
minusOccEnv :: OccEnv a -> OccEnv b -> OccEnv a
minusOccEnv :: forall a b. OccEnv a -> OccEnv b -> OccEnv a
minusOccEnv = (UniqFM NameSpace a -> UniqFM NameSpace b -> UniqFM NameSpace a)
-> OccEnv a -> OccEnv b -> OccEnv a
forall a b.
(UniqFM NameSpace a -> UniqFM NameSpace b -> UniqFM NameSpace a)
-> OccEnv a -> OccEnv b -> OccEnv a
minusOccEnv_C_Ns UniqFM NameSpace a -> UniqFM NameSpace b -> UniqFM NameSpace a
forall key elt1 elt2.
UniqFM key elt1 -> UniqFM key elt2 -> UniqFM key elt1
minusUFM
minusOccEnv_C :: (a -> b -> Maybe a)
-> OccEnv a -> OccEnv b -> OccEnv a
minusOccEnv_C :: forall a b. (a -> b -> Maybe a) -> OccEnv a -> OccEnv b -> OccEnv a
minusOccEnv_C a -> b -> Maybe a
f = (UniqFM NameSpace a -> UniqFM NameSpace b -> UniqFM NameSpace a)
-> OccEnv a -> OccEnv b -> OccEnv a
forall a b.
(UniqFM NameSpace a -> UniqFM NameSpace b -> UniqFM NameSpace a)
-> OccEnv a -> OccEnv b -> OccEnv a
minusOccEnv_C_Ns ((a -> b -> Maybe a)
-> UniqFM NameSpace a -> UniqFM NameSpace b -> UniqFM NameSpace a
forall elt1 elt2 key.
(elt1 -> elt2 -> Maybe elt1)
-> UniqFM key elt1 -> UniqFM key elt2 -> UniqFM key elt1
minusUFM_C a -> b -> Maybe a
f)
minusOccEnv_C_Ns :: forall a b
. (UniqFM NameSpace a -> UniqFM NameSpace b -> UniqFM NameSpace a)
-> OccEnv a -> OccEnv b -> OccEnv a
minusOccEnv_C_Ns :: forall a b.
(UniqFM NameSpace a -> UniqFM NameSpace b -> UniqFM NameSpace a)
-> OccEnv a -> OccEnv b -> OccEnv a
minusOccEnv_C_Ns UniqFM NameSpace a -> UniqFM NameSpace b -> UniqFM NameSpace a
f (MkOccEnv FastStringEnv (UniqFM NameSpace a)
as) (MkOccEnv FastStringEnv (UniqFM NameSpace b)
bs) =
FastStringEnv (UniqFM NameSpace a) -> OccEnv a
forall a. FastStringEnv (UniqFM NameSpace a) -> OccEnv a
MkOccEnv (FastStringEnv (UniqFM NameSpace a) -> OccEnv a)
-> FastStringEnv (UniqFM NameSpace a) -> OccEnv a
forall a b. (a -> b) -> a -> b
$ (UniqFM NameSpace a
-> UniqFM NameSpace b -> Maybe (UniqFM NameSpace a))
-> FastStringEnv (UniqFM NameSpace a)
-> FastStringEnv (UniqFM NameSpace b)
-> FastStringEnv (UniqFM NameSpace a)
forall elt1 elt2 key.
(elt1 -> elt2 -> Maybe elt1)
-> UniqFM key elt1 -> UniqFM key elt2 -> UniqFM key elt1
minusUFM_C UniqFM NameSpace a
-> UniqFM NameSpace b -> Maybe (UniqFM NameSpace a)
g FastStringEnv (UniqFM NameSpace a)
as FastStringEnv (UniqFM NameSpace b)
bs
where
g :: UniqFM NameSpace a -> UniqFM NameSpace b -> Maybe (UniqFM NameSpace a)
g :: UniqFM NameSpace a
-> UniqFM NameSpace b -> Maybe (UniqFM NameSpace a)
g UniqFM NameSpace a
as UniqFM NameSpace b
bs =
let m :: UniqFM NameSpace a
m = UniqFM NameSpace a -> UniqFM NameSpace b -> UniqFM NameSpace a
f UniqFM NameSpace a
as UniqFM NameSpace b
bs
in if UniqFM NameSpace a -> Bool
forall key elt. UniqFM key elt -> Bool
isNullUFM UniqFM NameSpace a
m
then Maybe (UniqFM NameSpace a)
forall a. Maybe a
Nothing
else UniqFM NameSpace a -> Maybe (UniqFM NameSpace a)
forall a. a -> Maybe a
Just UniqFM NameSpace a
m
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
ppr OccEnv a
x
pprOccEnv :: (a -> SDoc) -> OccEnv a -> SDoc
pprOccEnv :: forall a. (a -> SDoc) -> OccEnv a -> SDoc
pprOccEnv a -> SDoc
ppr_elt (MkOccEnv FastStringEnv (UniqFM NameSpace a)
env)
= SDoc -> SDoc
forall doc. IsLine doc => doc -> doc
brackets (SDoc -> SDoc) -> SDoc -> SDoc
forall a b. (a -> b) -> a -> b
$ [SDoc] -> SDoc
forall doc. IsLine doc => [doc] -> doc
fsep ([SDoc] -> SDoc) -> [SDoc] -> SDoc
forall a b. (a -> b) -> a -> b
$ SDoc -> [SDoc] -> [SDoc]
forall doc. IsLine doc => doc -> [doc] -> [doc]
punctuate SDoc
forall doc. IsLine doc => doc
comma ([SDoc] -> [SDoc]) -> [SDoc] -> [SDoc]
forall a b. (a -> b) -> a -> b
$
[ Unique -> SDoc
forall a. Outputable a => a -> SDoc
ppr Unique
uq SDoc -> SDoc -> SDoc
forall doc. IsLine doc => doc -> doc -> doc
<+> [Char] -> SDoc
forall doc. IsLine doc => [Char] -> doc
text [Char]
":->" SDoc -> SDoc -> SDoc
forall doc. IsLine doc => doc -> doc -> doc
<+> a -> SDoc
ppr_elt a
elt
| (Unique
uq, UniqFM NameSpace a
elts) <- FastStringEnv (UniqFM NameSpace a)
-> [(Unique, UniqFM NameSpace a)]
forall key elt. UniqFM key elt -> [(Unique, elt)]
nonDetUFMToList FastStringEnv (UniqFM NameSpace a)
env
, a
elt <- UniqFM NameSpace a -> [a]
forall key elt. UniqFM key elt -> [elt]
nonDetEltsUFM UniqFM NameSpace a
elts ]
instance NFData a => NFData (OccEnv a) where
rnf :: OccEnv a -> ()
rnf = (a -> ()) -> OccEnv a -> ()
forall a. (a -> ()) -> OccEnv a -> ()
forceOccEnv a -> ()
forall a. NFData a => a -> ()
rnf
strictMapOccEnv :: (a -> b) -> OccEnv a -> OccEnv b
strictMapOccEnv :: forall a b. (a -> b) -> OccEnv a -> OccEnv b
strictMapOccEnv a -> b
f (MkOccEnv FastStringEnv (UniqFM NameSpace a)
as) =
FastStringEnv (UniqFM NameSpace b) -> OccEnv b
forall a. FastStringEnv (UniqFM NameSpace a) -> OccEnv a
MkOccEnv (FastStringEnv (UniqFM NameSpace b) -> OccEnv b)
-> FastStringEnv (UniqFM NameSpace b) -> OccEnv b
forall a b. (a -> b) -> a -> b
$ (UniqFM NameSpace a -> UniqFM NameSpace b)
-> FastStringEnv (UniqFM NameSpace a)
-> FastStringEnv (UniqFM NameSpace b)
forall a b. (a -> b) -> FastStringEnv a -> FastStringEnv b
strictMapFsEnv ((a -> b) -> UniqFM NameSpace a -> UniqFM NameSpace b
forall a b k. (a -> b) -> UniqFM k a -> UniqFM k b
strictMapUFM a -> b
f) FastStringEnv (UniqFM NameSpace a)
as
forceOccEnv :: (a -> ()) -> OccEnv a -> ()
forceOccEnv :: forall a. (a -> ()) -> OccEnv a -> ()
forceOccEnv a -> ()
nf (MkOccEnv FastStringEnv (UniqFM NameSpace a)
fs) = (UniqFM NameSpace a -> ())
-> FastStringEnv (UniqFM NameSpace a) -> ()
forall elt key. (elt -> ()) -> UniqFM key elt -> ()
seqEltsUFM ((a -> ()) -> UniqFM NameSpace a -> ()
forall elt key. (elt -> ()) -> UniqFM key elt -> ()
seqEltsUFM a -> ()
nf) FastStringEnv (UniqFM NameSpace a)
fs
type OccSet = FastStringEnv (UniqSet NameSpace)
emptyOccSet :: OccSet
unitOccSet :: OccName -> OccSet
mkOccSet :: [OccName] -> OccSet
extendOccSet :: OccSet -> OccName -> OccSet
extendOccSetList :: OccSet -> [OccName] -> OccSet
unionOccSets :: OccSet -> OccSet -> OccSet
unionManyOccSets :: [OccSet] -> OccSet
elemOccSet :: OccName -> OccSet -> Bool
isEmptyOccSet :: OccSet -> Bool
emptyOccSet :: OccSet
emptyOccSet = OccSet
forall a. FastStringEnv a
emptyFsEnv
unitOccSet :: OccName -> OccSet
unitOccSet (OccName NameSpace
ns FastString
s) = FastString -> UniqSet NameSpace -> OccSet
forall a. FastString -> a -> FastStringEnv a
unitFsEnv FastString
s (NameSpace -> UniqSet NameSpace
forall a. Uniquable a => a -> UniqSet a
unitUniqSet NameSpace
ns)
mkOccSet :: [OccName] -> OccSet
mkOccSet = OccSet -> [OccName] -> OccSet
extendOccSetList OccSet
emptyOccSet
extendOccSet :: OccSet -> OccName -> OccSet
extendOccSet OccSet
occs (OccName NameSpace
ns FastString
s) = OccSet -> FastString -> UniqSet NameSpace -> OccSet
forall a. FastStringEnv a -> FastString -> a -> FastStringEnv a
extendFsEnv OccSet
occs FastString
s (NameSpace -> UniqSet NameSpace
forall a. Uniquable a => a -> UniqSet a
unitUniqSet NameSpace
ns)
extendOccSetList :: OccSet -> [OccName] -> OccSet
extendOccSetList = (OccSet -> OccName -> OccSet) -> OccSet -> [OccName] -> OccSet
forall b a. (b -> a -> b) -> b -> [a] -> b
forall (t :: * -> *) b a.
Foldable t =>
(b -> a -> b) -> b -> t a -> b
foldl OccSet -> OccName -> OccSet
extendOccSet
unionOccSets :: OccSet -> OccSet -> OccSet
unionOccSets = (UniqSet NameSpace -> UniqSet NameSpace -> UniqSet NameSpace)
-> OccSet -> OccSet -> OccSet
forall a.
(a -> a -> a)
-> FastStringEnv a -> FastStringEnv a -> FastStringEnv a
plusFsEnv_C UniqSet NameSpace -> UniqSet NameSpace -> UniqSet NameSpace
forall a. UniqSet a -> UniqSet a -> UniqSet a
unionUniqSets
unionManyOccSets :: [OccSet] -> OccSet
unionManyOccSets = (OccSet -> OccSet -> OccSet) -> OccSet -> [OccSet] -> OccSet
forall b a. (b -> a -> b) -> b -> [a] -> b
forall (t :: * -> *) b a.
Foldable t =>
(b -> a -> b) -> b -> t a -> b
foldl' OccSet -> OccSet -> OccSet
unionOccSets OccSet
emptyOccSet
elemOccSet :: OccName -> OccSet -> Bool
elemOccSet (OccName NameSpace
ns FastString
s) OccSet
occs = Bool
-> (UniqSet NameSpace -> Bool) -> Maybe (UniqSet NameSpace) -> Bool
forall b a. b -> (a -> b) -> Maybe a -> b
maybe Bool
False (NameSpace -> UniqSet NameSpace -> Bool
forall a. Uniquable a => a -> UniqSet a -> Bool
elementOfUniqSet NameSpace
ns) (Maybe (UniqSet NameSpace) -> Bool)
-> Maybe (UniqSet NameSpace) -> Bool
forall a b. (a -> b) -> a -> b
$ OccSet -> FastString -> Maybe (UniqSet NameSpace)
forall a. FastStringEnv a -> FastString -> Maybe a
lookupFsEnv OccSet
occs FastString
s
isEmptyOccSet :: OccSet -> Bool
isEmptyOccSet = OccSet -> Bool
forall key elt. UniqFM key elt -> Bool
isNullUFM
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, isFieldOcc :: 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
isFieldOcc :: OccName -> Bool
isFieldOcc (OccName (FldName {}) FastString
_) = Bool
True
isFieldOcc OccName
_ = Bool
False
fieldOcc_maybe :: OccName -> Maybe FastString
fieldOcc_maybe :: OccName -> Maybe FastString
fieldOcc_maybe (OccName (FldName FastString
con) FastString
_) = FastString -> Maybe FastString
forall a. a -> Maybe a
Just FastString
con
fieldOcc_maybe OccName
_ = Maybe FastString
forall a. Maybe a
Nothing
isValOcc :: OccName -> Bool
isValOcc :: OccName -> Bool
isValOcc (OccName NameSpace
VarName FastString
_) = Bool
True
isValOcc (OccName NameSpace
DataName FastString
_) = Bool
True
isValOcc (OccName (FldName {}) 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
ns FastString
s) = case NameSpace
ns of
NameSpace
DataName -> FastString -> Bool
isLexConSym FastString
s
NameSpace
TcClsName -> FastString -> Bool
isLexSym FastString
s
NameSpace
VarName -> FastString -> Bool
isLexSym FastString
s
NameSpace
TvName -> FastString -> Bool
isLexSym FastString
s
FldName {} -> 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
forall doc. IsLine doc => doc -> doc
parens SDoc
doc
| Bool
otherwise = SDoc
doc
startsWithUnderscore :: OccName -> Bool
startsWithUnderscore :: OccName -> Bool
startsWithUnderscore OccName
occ = case FastString -> [Char]
unpackFS (OccName -> FastString
occNameFS OccName
occ) of
Char
'_':[Char]
_ -> Bool
True
[Char]
_ -> Bool
False
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, mkDataTOcc, mkDataCOcc,
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_"
mkDataTOcc :: OccName -> OccName
mkDataTOcc = NameSpace -> FastString -> OccName -> OccName
mk_simple_deriv NameSpace
varName FastString
"$t"
mkDataCOcc :: OccName -> OccName
mkDataCOcc = NameSpace -> FastString -> OccName -> OccName
mk_simple_deriv NameSpace
varName FastString
"$c"
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_"
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]
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]
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]
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"
chooseUniqueOcc :: NameSpace -> String -> OccSet -> OccName
chooseUniqueOcc :: NameSpace -> [Char] -> OccSet -> OccName
chooseUniqueOcc NameSpace
ns [Char]
str OccSet
set = OccName -> Int -> OccName
loop (NameSpace -> [Char] -> OccName
mkOccName NameSpace
ns [Char]
str) (Int
0::Int)
where
loop :: OccName -> Int -> OccName
loop OccName
occ Int
n
| OccName
occ OccName -> OccSet -> Bool
`elemOccSet` OccSet
set = OccName -> Int -> OccName
loop (NameSpace -> [Char] -> OccName
mkOccName NameSpace
ns ([Char]
str [Char] -> [Char] -> [Char]
forall a. [a] -> [a] -> [a]
++ Int -> [Char]
forall a. Show a => a -> [Char]
show Int
n)) (Int
nInt -> Int -> Int
forall a. Num a => a -> a -> a
+Int
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 FastString Int
emptyTidyOccEnv :: TidyOccEnv
emptyTidyOccEnv :: TidyOccEnv
emptyTidyOccEnv = TidyOccEnv
forall key elt. UniqFM key elt
emptyUFM
initTidyOccEnv :: [OccName] -> TidyOccEnv
initTidyOccEnv :: [OccName] -> TidyOccEnv
initTidyOccEnv = (TidyOccEnv -> OccName -> TidyOccEnv)
-> TidyOccEnv -> [OccName] -> TidyOccEnv
forall b a. (b -> a -> b) -> b -> [a] -> b
forall (t :: * -> *) b a.
Foldable t =>
(b -> a -> b) -> b -> t a -> b
foldl' TidyOccEnv -> OccName -> TidyOccEnv
forall {elt}.
Num elt =>
UniqFM FastString elt -> OccName -> UniqFM FastString elt
add TidyOccEnv
forall key elt. UniqFM key elt
emptyUFM
where
add :: UniqFM FastString elt -> OccName -> UniqFM FastString elt
add UniqFM FastString elt
env (OccName NameSpace
_ FastString
fs) = UniqFM FastString elt -> FastString -> elt -> UniqFM FastString elt
forall key elt.
Uniquable key =>
UniqFM key elt -> key -> elt -> UniqFM key elt
addToUFM UniqFM FastString elt
env FastString
fs elt
1
delTidyOccEnvList :: TidyOccEnv -> [FastString] -> TidyOccEnv
delTidyOccEnvList :: TidyOccEnv -> [FastString] -> TidyOccEnv
delTidyOccEnvList = TidyOccEnv -> [FastString] -> TidyOccEnv
forall key elt.
Uniquable key =>
UniqFM key elt -> [key] -> UniqFM key elt
delListFromUFM
avoidClashesOccEnv :: TidyOccEnv -> [OccName] -> TidyOccEnv
avoidClashesOccEnv :: TidyOccEnv -> [OccName] -> TidyOccEnv
avoidClashesOccEnv TidyOccEnv
env [OccName]
occs = TidyOccEnv -> UniqFM FastString () -> [OccName] -> TidyOccEnv
forall {elt}.
Num elt =>
UniqFM FastString elt
-> UniqFM FastString () -> [OccName] -> UniqFM FastString elt
go TidyOccEnv
env UniqFM FastString ()
forall key elt. UniqFM key elt
emptyUFM [OccName]
occs
where
go :: UniqFM FastString elt
-> UniqFM FastString () -> [OccName] -> UniqFM FastString elt
go UniqFM FastString elt
env UniqFM FastString ()
_ [] = UniqFM FastString elt
env
go UniqFM FastString elt
env UniqFM FastString ()
seenOnce ((OccName NameSpace
_ FastString
fs):[OccName]
occs)
| FastString
fs FastString -> UniqFM FastString elt -> Bool
forall key elt. Uniquable key => key -> UniqFM key elt -> Bool
`elemUFM` UniqFM FastString elt
env = UniqFM FastString elt
-> UniqFM FastString () -> [OccName] -> UniqFM FastString elt
go UniqFM FastString elt
env UniqFM FastString ()
seenOnce [OccName]
occs
| FastString
fs FastString -> UniqFM FastString () -> Bool
forall key elt. Uniquable key => key -> UniqFM key elt -> Bool
`elemUFM` UniqFM FastString ()
seenOnce = UniqFM FastString elt
-> UniqFM FastString () -> [OccName] -> UniqFM FastString elt
go (UniqFM FastString elt -> FastString -> elt -> UniqFM FastString elt
forall key elt.
Uniquable key =>
UniqFM key elt -> key -> elt -> UniqFM key elt
addToUFM UniqFM FastString elt
env FastString
fs elt
1) UniqFM FastString ()
seenOnce [OccName]
occs
| Bool
otherwise = UniqFM FastString elt
-> UniqFM FastString () -> [OccName] -> UniqFM FastString elt
go UniqFM FastString elt
env (UniqFM FastString () -> FastString -> () -> UniqFM FastString ()
forall key elt.
Uniquable key =>
UniqFM key elt -> key -> elt -> UniqFM key elt
addToUFM UniqFM FastString ()
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 key elt -> Bool
`elemUFM` TidyOccEnv
env)
=
(TidyOccEnv -> FastString -> Int -> TidyOccEnv
forall key elt.
Uniquable key =>
UniqFM key elt -> key -> elt -> UniqFM key elt
addToUFM TidyOccEnv
env FastString
fs Int
1, OccName
occ)
| Bool
otherwise
= case TidyOccEnv -> FastString -> Maybe Int
forall key elt. Uniquable key => UniqFM key elt -> key -> Maybe elt
lookupUFM TidyOccEnv
env FastString
base1 of
Maybe Int
Nothing -> (TidyOccEnv -> FastString -> Int -> TidyOccEnv
forall key elt.
Uniquable key =>
UniqFM key elt -> key -> elt -> UniqFM key elt
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 FastString -> TidyOccEnv -> Bool
forall key elt. Uniquable key => key -> UniqFM key elt -> Bool
elemUFM FastString
new_fs TidyOccEnv
env of
Bool
True -> Int -> Int -> (TidyOccEnv, OccName)
find (Int
kInt -> Int -> Int
forall a. Num a => a -> a -> a
+Int
1 :: Int) (Int
nInt -> Int -> Int
forall a. Num a => a -> a -> a
+Int
k)
Bool
False -> (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]
show Int
n)
new_env :: TidyOccEnv
new_env = TidyOccEnv -> FastString -> Int -> TidyOccEnv
forall key elt.
Uniquable key =>
UniqFM key elt -> key -> elt -> UniqFM key elt
addToUFM (TidyOccEnv -> FastString -> Int -> TidyOccEnv
forall key elt.
Uniquable key =>
UniqFM key elt -> key -> elt -> UniqFM key elt
addToUFM TidyOccEnv
env FastString
new_fs Int
1) FastString
base1 (Int
nInt -> Int -> Int
forall a. Num a => a -> a -> a
+Int
1)
mainOcc :: OccName
mainOcc :: OccName
mainOcc = FastString -> OccName
mkVarOccFS ([Char] -> FastString
fsLit [Char]
"main")
ppMainFn :: OccName -> SDoc
ppMainFn :: OccName -> SDoc
ppMainFn OccName
main_occ
| OccName
main_occ OccName -> OccName -> Bool
forall a. Eq a => a -> a -> Bool
== OccName
mainOcc
= [Char] -> SDoc
forall doc. IsLine doc => [Char] -> doc
text [Char]
"IO action" SDoc -> SDoc -> SDoc
forall doc. IsLine doc => doc -> doc -> doc
<+> SDoc -> SDoc
quotes (OccName -> SDoc
forall a. Outputable a => a -> SDoc
ppr OccName
main_occ)
| Bool
otherwise
= [Char] -> SDoc
forall doc. IsLine doc => [Char] -> doc
text [Char]
"main IO action" SDoc -> SDoc -> SDoc
forall doc. IsLine doc => doc -> doc -> doc
<+> SDoc -> SDoc
quotes (OccName -> SDoc
forall a. Outputable a => a -> SDoc
ppr OccName
main_occ)
instance Binary NameSpace where
put_ :: BinHandle -> NameSpace -> IO ()
put_ BinHandle
bh NameSpace
VarName =
BinHandle -> Word8 -> IO ()
putByte BinHandle
bh Word8
0
put_ BinHandle
bh NameSpace
DataName =
BinHandle -> Word8 -> IO ()
putByte BinHandle
bh Word8
1
put_ BinHandle
bh NameSpace
TvName =
BinHandle -> Word8 -> IO ()
putByte BinHandle
bh Word8
2
put_ BinHandle
bh NameSpace
TcClsName =
BinHandle -> Word8 -> IO ()
putByte BinHandle
bh Word8
3
put_ BinHandle
bh (FldName FastString
parent) = do
BinHandle -> Word8 -> IO ()
putByte BinHandle
bh Word8
4
BinHandle -> FastString -> IO ()
forall a. Binary a => BinHandle -> a -> IO ()
put_ BinHandle
bh FastString
parent
get :: BinHandle -> IO NameSpace
get BinHandle
bh = do
Word8
h <- BinHandle -> IO Word8
getByte BinHandle
bh
case Word8
h of
Word8
0 -> NameSpace -> IO NameSpace
forall a. a -> IO a
forall (m :: * -> *) a. Monad m => a -> m a
return NameSpace
VarName
Word8
1 -> NameSpace -> IO NameSpace
forall a. a -> IO a
forall (m :: * -> *) a. Monad m => a -> m a
return NameSpace
DataName
Word8
2 -> NameSpace -> IO NameSpace
forall a. a -> IO a
forall (m :: * -> *) a. Monad m => a -> m a
return NameSpace
TvName
Word8
3 -> NameSpace -> IO NameSpace
forall a. a -> IO a
forall (m :: * -> *) a. Monad m => a -> m a
return NameSpace
TcClsName
Word8
_ -> do
FastString
parent <- BinHandle -> IO FastString
forall a. Binary a => BinHandle -> IO a
get BinHandle
bh
NameSpace -> IO NameSpace
forall a. a -> IO a
forall (m :: * -> *) a. Monad m => a -> m a
return (NameSpace -> IO NameSpace) -> NameSpace -> IO NameSpace
forall a b. (a -> b) -> a -> b
$ FldName { fldParent :: FastString
fldParent = FastString
parent }
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 ()
put_ BinHandle
bh NameSpace
aa
BinHandle -> FastString -> IO ()
forall a. Binary a => BinHandle -> a -> IO ()
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
get BinHandle
bh
FastString
ab <- BinHandle -> IO FastString
forall a. Binary a => BinHandle -> IO a
get BinHandle
bh
OccName -> IO OccName
forall a. a -> IO a
forall (m :: * -> *) a. Monad m => a -> m a
return (NameSpace -> FastString -> OccName
OccName NameSpace
aa FastString
ab)