-import Name ( getOccName, getSrcLoc, Name{-instance NamedThing-} )
-import PprStyle
-import Pretty
-import RnHsSyn ( RnName(..) )
-import Type ( splitForAllTy )
-import Unique ( pprUnique10, pprUnique{-ToDo:rm-} )
-import UniqFM
-import Util ( zipWithEqual, zipWith3Equal, zipLazy, panic, pprPanic, pprTrace{-ToDo:rm-} )
-\end{code}
-
-Data type declarations
-~~~~~~~~~~~~~~~~~~~~~
-
-\begin{code}
-data TcEnv s = TcEnv
- (TyVarEnv s)
- (TyConEnv s)
- (ClassEnv s)
- (ValueEnv Id) -- Globals
- (ValueEnv (TcIdBndr s)) -- Locals
- (MutableVar s (TcTyVarSet s)) -- Free type variables of locals
- -- ...why mutable? see notes with tcGetGlobalTyVars
-
-type TyVarEnv s = UniqFM (TcKind s, TyVar)
-type TyConEnv s = UniqFM (TcKind s, Maybe Arity, TyCon) -- Arity present for Synonyms only
-type ClassEnv s = UniqFM (TcKind s, Class)
-type ValueEnv id = UniqFM id
-
-initEnv :: MutableVar s (TcTyVarSet s) -> TcEnv s
-initEnv mut = TcEnv emptyUFM emptyUFM emptyUFM emptyUFM emptyUFM mut
-
-getEnv_LocalIds (TcEnv _ _ _ _ ls _) = eltsUFM ls
-getEnv_TyCons (TcEnv _ ts _ _ _ _) = [tycon | (_, _, tycon) <- eltsUFM ts]
-getEnv_Classes (TcEnv _ _ cs _ _ _) = [clas | (_, clas) <- eltsUFM cs]
-\end{code}
-
-Making new TcTyVars, with knot tying!
-~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-\begin{code}
-tcTyVarScopeGivenKinds
- :: [Name] -- Names of some type variables
- -> [TcKind s]
- -> ([TyVar] -> TcM s a) -- Thing to type check in their scope
- -> TcM s a -- Result
-
-tcTyVarScopeGivenKinds names kinds thing_inside
- = fixTc (\ ~(rec_tyvars, _) ->
- -- Ok to look at names, kinds, but not tyvars!
-
- tcGetEnv `thenNF_Tc` \ (TcEnv tve tce ce gve lve gtvs) ->
- let
- tve' = addListToUFM tve (names `zip` (kinds `zipLazy` rec_tyvars))
- in
- tcSetEnv (TcEnv tve' tce ce gve lve gtvs)
- (thing_inside rec_tyvars) `thenTc` \ result ->
-
- -- Get the tyvar's Kinds from their TcKinds
- mapNF_Tc tcDefaultKind kinds `thenNF_Tc` \ kinds' ->
-
- -- Construct the real TyVars
- let
- tyvars = zipWithEqual mk_tyvar names kinds'
- mk_tyvar name kind = mkTyVar name (uniqueOf name) kind
- in
- returnTc (tyvars, result)
- ) `thenTc` \ (_,result) ->
- returnTc result
-
-tcTyVarScope names thing_inside
- = newKindVars (length names) `thenNF_Tc` \ kinds ->
- tcTyVarScopeGivenKinds names kinds thing_inside
+import BasicTypes ( Arity )
+import IdInfo ( noIdInfo )
+import Name ( Name, OccName, nameOccName, occNameString, mkLocalName,
+ maybeWiredInTyConName, maybeWiredInIdName, isLocallyDefined,
+ isSysLocalName,
+ NamedThing(..)
+ )
+import Unique ( pprUnique10, Unique, Uniquable(..) )
+import FiniteMap ( lookupFM, addToFM )
+import UniqFM
+import Unique ( Uniquable(..) )
+import Util ( zipEqual, zipWith3Equal, mapAccumL )
+import Bag ( bagToList )
+import Maybes ( maybeToBool )
+import FastString ( FastString )
+import Outputable