2 % (c) The AQUA Project, Glasgow University, 1996
4 \section[TcTyClsDecls]{Typecheck type and class declarations}
7 #include "HsVersions.h"
15 import HsSyn ( HsDecl(..), TyDecl(..), ConDecl(..), ConDetails(..), BangType(..),
16 ClassDecl(..), HsType(..), HsTyVar, DefaultDecl, InstDecl,
17 IfaceSig, Sig(..), MonoBinds, Fake, InPat, HsBinds(..), HsExpr, NewOrData,
20 import RnHsSyn ( RenamedTyDecl(..), RenamedClassDecl(..), SYN_IE(RenamedHsDecl)
22 import TcHsSyn ( SYN_IE(TcHsBinds), TcIdOcc(..) )
25 import Inst ( SYN_IE(InstanceMapper) )
26 import TcClassDcl ( tcClassDecl1 )
27 import TcEnv ( tcExtendTyConEnv, tcExtendClassEnv )
28 import SpecEnv ( SpecEnv )
29 import TcKind ( TcKind, newKindVars )
30 import TcTyDecls ( tcTyDecl, mkDataBinds )
31 import TcMonoType ( tcTyVarScope )
34 import Class ( SYN_IE(Class) )
35 import Digraph ( stronglyConnComp, SCC(..) )
36 import Name ( Name, getSrcLoc, isTvOcc, nameOccName )
39 import Maybes ( mapMaybe )
40 import UniqSet ( SYN_IE(UniqSet), emptyUniqSet,
41 unitUniqSet, unionUniqSets,
42 unionManyUniqSets, uniqSetToList )
43 import SrcLoc ( SrcLoc )
44 import TyCon ( TyCon, SYN_IE(Arity) )
45 import Unique ( Unique, Uniquable(..) )
46 import Util ( panic{-, pprTrace-} )
53 tcTyAndClassDecls1 :: TcEnv s -> InstanceMapper -- Knot tying stuff
57 tcTyAndClassDecls1 unf_env inst_mapper decls
58 = sortByDependency decls `thenTc` \ groups ->
59 tcGroups unf_env inst_mapper groups
61 tcGroups unf_env inst_mapper []
62 = tcGetEnv `thenNF_Tc` \ env ->
65 tcGroups unf_env inst_mapper (group:groups)
66 = tcGroup unf_env inst_mapper group `thenTc` \ new_env ->
68 -- Extend the environment using the new tycons and classes
71 -- Do the remaining groups
72 tcGroups unf_env inst_mapper groups
78 tcGroup :: TcEnv s -> InstanceMapper -> Bag RenamedHsDecl -> TcM s (TcEnv s)
79 tcGroup unf_env inst_mapper decls
81 fixTc ( \ ~(tycons,classes,_) ->
83 -- EXTEND TYPE AND CLASS ENVIRONMENTS
84 -- NB: it's important that the tycons and classes come back in just
85 -- the same order from this fix as from get_binders, so that these
86 -- extend-env things work properly. A bit UGH-ish.
87 tcExtendTyConEnv tycon_names_w_arities tycons $
88 tcExtendClassEnv class_names classes $
90 -- DEAL WITH TYPE VARIABLES
91 tcTyVarScope tyvar_names ( \ tyvars ->
93 -- DEAL WITH THE DEFINITIONS THEMSELVES
94 foldBag combine (tcDecl unf_env inst_mapper)
95 (returnTc (emptyBag, emptyBag))
97 ) `thenTc` \ (tycon_bag,class_bag) ->
99 tycons = bagToList tycon_bag
100 classes = bagToList class_bag
103 -- SNAFFLE ENV TO RETURN
104 tcGetEnv `thenNF_Tc` \ final_env ->
106 returnTc (tycons, classes, final_env)
107 ) `thenTc` \ (_, _, final_env) ->
112 (tyvar_names, tycon_names_w_arities, class_names) = get_binders decls
115 = do_a `thenTc` \ (a1,a2) ->
116 do_b `thenTc` \ (b1,b2) ->
117 returnTc (a1 `unionBags` b1, a2 `unionBags` b2)
120 Dealing with one decl
121 ~~~~~~~~~~~~~~~~~~~~~
123 tcDecl :: TcEnv s -> InstanceMapper
125 -> TcM s (Bag TyCon, Bag Class)
127 tcDecl unf_env inst_mapper (TyD decl)
128 = tcTyDecl decl `thenTc` \ tycon ->
129 returnTc (unitBag tycon, emptyBag)
131 tcDecl unf_env inst_mapper (ClD decl)
132 = tcClassDecl1 unf_env inst_mapper decl `thenTc` \ clas ->
133 returnTc (emptyBag, unitBag clas)
139 sortByDependency :: [RenamedHsDecl] -> TcM s [Bag RenamedHsDecl]
140 sortByDependency decls
141 = let -- CHECK FOR SYNONYM CYCLES
142 syn_sccs = stronglyConnComp (filter is_syn_decl edges)
143 syn_cycles = [ decls | CyclicSCC decls <- syn_sccs]
146 checkTc (null syn_cycles) (typeCycleErr syn_cycles) `thenTc_`
148 let -- CHECK FOR CLASS CYCLES
149 cls_sccs = stronglyConnComp (filter is_cls_decl edges)
150 cls_cycles = [ decls | CyclicSCC decls <- cls_sccs]
153 checkTc (null cls_cycles) (classCycleErr cls_cycles) `thenTc_`
155 -- DO THE MAIN DEPENDENCY ANALYSIS
157 decl_sccs = stronglyConnComp (filter is_ty_cls_decl edges)
158 scc_bags = map bag_acyclic decl_sccs
163 edges = mapMaybe mk_edges decls
165 bag_acyclic (AcyclicSCC scc) = unitBag scc
166 bag_acyclic (CyclicSCC sccs) = listToBag sccs
168 is_syn_decl (TyD (TySynonym _ _ _ _), _, _) = True
169 is_syn_decl _ = False
171 is_ty_cls_decl (TyD _, _, _) = True
172 is_ty_cls_decl (ClD _, _, _) = True
173 is_ty_cls_decl other = False
175 is_cls_decl (ClD _, _, _) = True
176 is_cls_decl other = False
179 Edges in Type/Class decls
180 ~~~~~~~~~~~~~~~~~~~~~~~~~
182 mk_edges decl@(TyD (TyData _ ctxt name _ condecls derivs _ _))
183 = Just (decl, uniqueOf name, uniqSetToList (get_ctxt ctxt `unionUniqSets`
184 get_cons condecls `unionUniqSets`
187 mk_edges decl@(TyD (TySynonym name _ rhs _))
188 = Just (decl, uniqueOf name, uniqSetToList (get_ty rhs))
190 mk_edges decl@(ClD (ClassDecl ctxt name _ sigs _ _ _))
191 = Just (decl, uniqueOf name, uniqSetToList (get_ctxt ctxt `unionUniqSets`
194 mk_edges other_decl = Nothing
196 get_ctxt ctxt = unionManyUniqSets (map (set_name.fst) ctxt)
198 get_deriv Nothing = emptyUniqSet
199 get_deriv (Just clss) = unionManyUniqSets (map set_name clss)
201 get_cons cons = unionManyUniqSets (map get_con cons)
203 get_con (ConDecl _ ctxt details _)
204 = get_ctxt ctxt `unionUniqSets` get_con_details details
206 get_con_details (VanillaCon btys) = unionManyUniqSets (map get_bty btys)
207 get_con_details (InfixCon bty1 bty2) = unionUniqSets (get_bty bty1) (get_bty bty2)
208 get_con_details (NewCon ty) = get_ty ty
209 get_con_details (RecCon nbtys) = unionManyUniqSets (map (get_bty.snd) nbtys)
211 get_bty (Banged ty) = get_ty ty
212 get_bty (Unbanged ty) = get_ty ty
214 get_ty (MonoTyVar name)
215 = if isTvOcc (nameOccName name) then emptyUniqSet else set_name name
216 get_ty (MonoTyApp ty1 ty2)
217 = unionUniqSets (get_ty ty1) (get_ty ty2)
218 get_ty (MonoFunTy ty1 ty2)
219 = unionUniqSets (get_ty ty1) (get_ty ty2)
220 get_ty (MonoListTy tc ty)
221 = set_name tc `unionUniqSets` get_ty ty
222 get_ty (MonoTupleTy tc tys)
223 = set_name tc `unionUniqSets` get_tys tys
224 get_ty (HsForAllTy _ ctxt mty)
225 = get_ctxt ctxt `unionUniqSets` get_ty mty
226 get_ty other = panic "TcTyClsDecls:get_ty"
229 = unionManyUniqSets (map get_ty tys)
232 = unionManyUniqSets (map get_sig sigs)
234 get_sig (ClassOpSig _ _ ty _) = get_ty ty
235 get_sig other = panic "TcTyClsDecls:get_sig"
237 set_name name = unitUniqSet (uniqueOf name)
239 set_to_bag set = listToBag (uniqSetToList set)
245 Extract *binding* names from type and class decls. Type variables are
246 bound in type, data, newtype and class declarations and the polytypes
247 in the class op sigs.
249 Why do we need to grab all these type variables at once, including
250 those locally-quantified type variables in class op signatures?
251 Because we can only commit to the final kind of a type variable when
252 we've completed the mutually recursive group. For example:
255 op :: D b => a -> b -> b
258 bop :: (Monad c) => ...
260 Here, the kind of the locally-polymorphic type variable "b"
261 depends on *all the uses of class D*. For example, the use of
262 Monad c in bop's type signature means that D must have kind Type->Type.
266 get_binders :: Bag RenamedHsDecl
267 -> ([HsTyVar Name], -- TyVars; no dups
268 [(Name, Maybe Arity)], -- Tycons; no dups; arities for synonyms
269 [Name]) -- Classes; no dups
271 get_binders decls = (bagToList tyvars, bagToList tycons, bagToList classes)
273 (tyvars, tycons, classes) = foldBag union3 get_binders1
274 (emptyBag,emptyBag,emptyBag)
277 union3 (a1,a2,a3) (b1,b2,b3)
278 = (a1 `unionBags` b1, a2 `unionBags` b2, a3 `unionBags` b3)
280 get_binders1 (TyD (TyData _ _ name tyvars _ _ _ _))
281 = (listToBag tyvars, unitBag (name,Nothing), emptyBag)
282 get_binders1 (TyD (TySynonym name tyvars _ _))
283 = (listToBag tyvars, unitBag (name, Just (length tyvars)), emptyBag)
284 get_binders1 (ClD (ClassDecl _ name tyvar sigs _ _ _))
285 = (unitBag tyvar `unionBags` sigs_tvs sigs,
286 emptyBag, unitBag name)
288 sigs_tvs sigs = unionManyBags (map sig_tvs sigs)
290 sig_tvs (ClassOpSig _ _ ty _) = pty_tvs ty
291 pty_tvs (HsForAllTy tvs _ _) = listToBag tvs -- tvs doesn't include the class tyvar
292 pty_tvs other = emptyBag
297 typeCycleErr syn_cycles sty
298 = vcat (map (pp_cycle sty "Cycle in type declarations ...") syn_cycles)
300 classCycleErr cls_cycles sty
301 = vcat (map (pp_cycle sty "Cycle in class declarations ...") cls_cycles)
303 pp_cycle sty str decls
305 4 (vcat (map pp_decl decls))
308 = hsep [ppr sty name, ppr sty (getSrcLoc name)]
310 name = hsDeclName decl