2 #include "HsVersions.h"
5 GenTyVar(..), SYN_IE(TyVar),
7 tyVarKind, -- TyVar -> Kind
11 alphaTyVars, alphaTyVar, betaTyVar, gammaTyVar, deltaTyVar,
13 -- We also export "environments" keyed off of
14 -- TyVars and "sets" containing TyVars:
16 nullTyVarEnv, mkTyVarEnv, addOneToTyVarEnv,
17 growTyVarEnvList, isNullTyVarEnv, lookupTyVarEnv, delFromTyVarEnv,
19 SYN_IE(GenTyVarSet), SYN_IE(TyVarSet),
20 emptyTyVarSet, unitTyVarSet, unionTyVarSets,
21 unionManyTyVarSets, intersectTyVarSets, mkTyVarSet,
22 tyVarSetToList, elementOfTyVarSet, minusTyVarSet,
26 CHK_Ubiq() -- debugging consistency check
29 import Usage ( GenUsage, SYN_IE(Usage), usageOmega )
30 import Kind ( Kind, mkBoxedTypeKind, mkTypeKind )
33 import UniqSet -- nearly all of it
34 import UniqFM ( emptyUFM, listToUFM, addToUFM, lookupUFM,
35 plusUFM, sizeUFM, delFromUFM, UniqFM
37 import Name ( mkSysLocalName, mkLocalName, Name, NamedThing(..), OccName )
38 import Pretty ( Doc, (<>), ptext )
39 import Outputable ( PprStyle(..), Outputable(..) )
40 import SrcLoc ( noSrcLoc, SrcLoc )
41 import Unique ( mkAlphaTyVarUnique, Unique, Uniquable(..) )
42 import Util ( panic, Ord3(..) )
46 data GenTyVar flexi_slot
50 (Maybe Name) -- User name (if any)
51 flexi_slot -- Extra slot used during type and usage
52 -- inference, and to contain usages.
54 type TyVar = GenTyVar Usage -- Usage slot makes sense only if Kind = Type
58 Simple construction and analysis functions
59 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
61 mkTyVar :: Name -> Kind -> TyVar
62 mkTyVar name kind = TyVar (uniqueOf name)
67 mkSysTyVar :: Unique -> Kind -> TyVar
68 mkSysTyVar uniq kind = TyVar uniq
73 tyVarKind :: GenTyVar flexi -> Kind
74 tyVarKind (TyVar _ kind _ _) = kind
76 cloneTyVar :: GenTyVar flexi -> Unique -> GenTyVar flexi
77 cloneTyVar (TyVar _ k n x) u = TyVar u k n x
78 -- Dodgy: doesn't (yet) change the unique in the Name)
80 nameTyVar :: GenTyVar flexi -> OccName -> GenTyVar flexi
81 -- Give the TyVar a print-name
82 nameTyVar (TyVar u k n x) occ = TyVar u k (Just (mkLocalName u occ noSrcLoc)) x
86 Fixed collection of type variables
87 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
89 -- openAlphaTyVar is prepared to be instantiated
90 -- to a boxed or unboxed type variable. It's used for the
91 -- result type for "error", so that we can have (error Int# "Help")
92 openAlphaTyVar = TyVar (mkAlphaTyVarUnique 1) mkTypeKind Nothing usageOmega
94 alphaTyVars = [ TyVar u mkBoxedTypeKind Nothing usageOmega
95 | u <- map mkAlphaTyVarUnique [2..] ]
97 (alphaTyVar:betaTyVar:gammaTyVar:deltaTyVar:_) = alphaTyVars
105 type TyVarEnv elt = UniqFM elt
107 nullTyVarEnv :: TyVarEnv a
108 mkTyVarEnv :: [(GenTyVar flexi, a)] -> TyVarEnv a
109 addOneToTyVarEnv :: TyVarEnv a -> GenTyVar flexi -> a -> TyVarEnv a
110 growTyVarEnvList :: TyVarEnv a -> [(GenTyVar flexi, a)] -> TyVarEnv a
111 isNullTyVarEnv :: TyVarEnv a -> Bool
112 lookupTyVarEnv :: TyVarEnv a -> GenTyVar flexi -> Maybe a
113 delFromTyVarEnv :: TyVarEnv a -> GenTyVar flexi -> TyVarEnv a
115 nullTyVarEnv = emptyUFM
116 mkTyVarEnv = listToUFM
117 addOneToTyVarEnv = addToUFM
118 lookupTyVarEnv = lookupUFM
119 delFromTyVarEnv = delFromUFM
121 growTyVarEnvList env pairs = plusUFM env (listToUFM pairs)
122 isNullTyVarEnv env = sizeUFM env == 0
128 type GenTyVarSet flexi = UniqSet (GenTyVar flexi)
129 type TyVarSet = UniqSet TyVar
131 emptyTyVarSet :: GenTyVarSet flexi
132 intersectTyVarSets:: GenTyVarSet flexi -> GenTyVarSet flexi -> GenTyVarSet flexi
133 unionTyVarSets :: GenTyVarSet flexi -> GenTyVarSet flexi -> GenTyVarSet flexi
134 unionManyTyVarSets:: [GenTyVarSet flexi] -> GenTyVarSet flexi
135 tyVarSetToList :: GenTyVarSet flexi -> [GenTyVar flexi]
136 unitTyVarSet :: GenTyVar flexi -> GenTyVarSet flexi
137 elementOfTyVarSet :: GenTyVar flexi -> GenTyVarSet flexi -> Bool
138 minusTyVarSet :: GenTyVarSet flexi -> GenTyVarSet flexi -> GenTyVarSet flexi
139 isEmptyTyVarSet :: GenTyVarSet flexi -> Bool
140 mkTyVarSet :: [GenTyVar flexi] -> GenTyVarSet flexi
142 emptyTyVarSet = emptyUniqSet
143 unitTyVarSet = unitUniqSet
144 intersectTyVarSets= intersectUniqSets
145 unionTyVarSets = unionUniqSets
146 unionManyTyVarSets= unionManyUniqSets
147 tyVarSetToList = uniqSetToList
148 elementOfTyVarSet = elementOfUniqSet
149 minusTyVarSet = minusUniqSet
150 isEmptyTyVarSet = isEmptyUniqSet
151 mkTyVarSet = mkUniqSet
157 instance Eq (GenTyVar a) where
158 (TyVar u1 _ _ _) == (TyVar u2 _ _ _) = u1 == u2
160 instance Ord3 (GenTyVar a) where
161 cmp (TyVar u1 _ _ _) (TyVar u2 _ _ _) = u1 `cmp` u2
163 instance Uniquable (GenTyVar a) where
164 uniqueOf (TyVar u _ _ _) = u
166 instance NamedThing (GenTyVar a) where
167 getName (TyVar _ _ (Just n) _) = n
168 getName (TyVar u _ _ _) = mkSysLocalName u SLIT("t") noSrcLoc