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 )
46 import UniqFM ( Uniquable(..) )
47 import Util ( panic{-, pprTrace-} )
54 tcTyAndClassDecls1 :: InstanceMapper
58 tcTyAndClassDecls1 inst_mapper decls
59 = sortByDependency decls `thenTc` \ groups ->
60 tcGroups inst_mapper groups
62 tcGroups inst_mapper []
63 = tcGetEnv `thenNF_Tc` \ env ->
66 tcGroups inst_mapper (group:groups)
67 = tcGroup inst_mapper group `thenTc` \ new_env ->
69 -- Extend the environment using the new tycons and classes
72 -- Do the remaining groups
73 tcGroups inst_mapper groups
79 tcGroup :: InstanceMapper -> Bag RenamedHsDecl -> TcM s (TcEnv s)
80 tcGroup inst_mapper decls
81 = -- pprTrace "tcGroup: " (hsep (map (fst.fmt_decl) (bagToList decls))) $
84 fixTc ( \ ~(tycons,classes,_) ->
86 -- EXTEND TYPE AND CLASS ENVIRONMENTS
87 -- NB: it's important that the tycons and classes come back in just
88 -- the same order from this fix as from get_binders, so that these
89 -- extend-env things work properly. A bit UGH-ish.
90 tcExtendTyConEnv tycon_names_w_arities tycons $
91 tcExtendClassEnv class_names classes $
93 -- DEAL WITH TYPE VARIABLES
94 tcTyVarScope tyvar_names ( \ tyvars ->
96 -- DEAL WITH THE DEFINITIONS THEMSELVES
97 foldBag combine (tcDecl inst_mapper)
98 (returnTc (emptyBag, emptyBag))
100 ) `thenTc` \ (tycon_bag,class_bag) ->
102 tycons = bagToList tycon_bag
103 classes = bagToList class_bag
106 -- SNAFFLE ENV TO RETURN
107 tcGetEnv `thenNF_Tc` \ final_env ->
109 returnTc (tycons, classes, final_env)
110 ) `thenTc` \ (_, _, final_env) ->
115 (tyvar_names, tycon_names_w_arities, class_names) = get_binders decls
118 = do_a `thenTc` \ (a1,a2) ->
119 do_b `thenTc` \ (b1,b2) ->
120 returnTc (a1 `unionBags` b1, a2 `unionBags` b2)
123 Dealing with one decl
124 ~~~~~~~~~~~~~~~~~~~~~
126 tcDecl :: InstanceMapper
128 -> TcM s (Bag TyCon, Bag Class)
130 tcDecl inst_mapper (TyD decl)
131 = tcTyDecl decl `thenTc` \ tycon ->
132 returnTc (unitBag tycon, emptyBag)
134 tcDecl inst_mapper (ClD decl)
135 = tcClassDecl1 inst_mapper decl `thenTc` \ clas ->
136 returnTc (emptyBag, unitBag clas)
142 sortByDependency :: [RenamedHsDecl] -> TcM s [Bag RenamedHsDecl]
143 sortByDependency decls
144 = let -- CHECK FOR SYNONYM CYCLES
145 syn_sccs = stronglyConnComp (filter is_syn_decl edges)
146 syn_cycles = [ decls | CyclicSCC decls <- syn_sccs]
149 checkTc (null syn_cycles) (typeCycleErr syn_cycles) `thenTc_`
151 let -- CHECK FOR CLASS CYCLES
152 cls_sccs = stronglyConnComp (filter is_cls_decl edges)
153 cls_cycles = [ decls | CyclicSCC decls <- cls_sccs]
156 checkTc (null cls_cycles) (classCycleErr cls_cycles) `thenTc_`
158 -- DO THE MAIN DEPENDENCY ANALYSIS
160 decl_sccs = stronglyConnComp (filter is_ty_cls_decl edges)
161 scc_bags = map bag_acyclic decl_sccs
166 edges = mapMaybe mk_edges decls
168 bag_acyclic (AcyclicSCC scc) = unitBag scc
169 bag_acyclic (CyclicSCC sccs) = listToBag sccs
171 is_syn_decl (TyD (TySynonym _ _ _ _), _, _) = True
172 is_syn_decl _ = False
174 is_ty_cls_decl (TyD _, _, _) = True
175 is_ty_cls_decl (ClD _, _, _) = True
176 is_ty_cls_decl other = False
178 is_cls_decl (ClD _, _, _) = True
179 is_cls_decl other = False
182 Edges in Type/Class decls
183 ~~~~~~~~~~~~~~~~~~~~~~~~~
185 mk_edges decl@(TyD (TyData _ ctxt name _ condecls derivs _ _))
186 = Just (decl, uniqueOf name, uniqSetToList (get_ctxt ctxt `unionUniqSets`
187 get_cons condecls `unionUniqSets`
190 mk_edges decl@(TyD (TySynonym name _ rhs _))
191 = Just (decl, uniqueOf name, uniqSetToList (get_ty rhs))
193 mk_edges decl@(ClD (ClassDecl ctxt name _ sigs _ _ _))
194 = Just (decl, uniqueOf name, uniqSetToList (get_ctxt ctxt `unionUniqSets`
197 mk_edges other_decl = Nothing
199 get_ctxt ctxt = unionManyUniqSets (map (set_name.fst) ctxt)
201 get_deriv Nothing = emptyUniqSet
202 get_deriv (Just clss) = unionManyUniqSets (map set_name clss)
204 get_cons cons = unionManyUniqSets (map get_con cons)
206 get_con (ConDecl _ ctxt details _)
207 = get_ctxt ctxt `unionUniqSets` get_con_details details
209 get_con_details (VanillaCon btys) = unionManyUniqSets (map get_bty btys)
210 get_con_details (InfixCon bty1 bty2) = unionUniqSets (get_bty bty1) (get_bty bty2)
211 get_con_details (NewCon ty) = get_ty ty
212 get_con_details (RecCon nbtys) = unionManyUniqSets (map (get_bty.snd) nbtys)
214 get_bty (Banged ty) = get_ty ty
215 get_bty (Unbanged ty) = get_ty ty
217 get_ty (MonoTyVar name)
218 = if isTvOcc (nameOccName name) then emptyUniqSet else set_name name
219 get_ty (MonoTyApp ty1 ty2)
220 = unionUniqSets (get_ty ty1) (get_ty ty2)
221 get_ty (MonoFunTy ty1 ty2)
222 = unionUniqSets (get_ty ty1) (get_ty ty2)
223 get_ty (MonoListTy tc ty)
224 = set_name tc `unionUniqSets` get_ty ty
225 get_ty (MonoTupleTy tc tys)
226 = set_name tc `unionUniqSets` get_tys tys
227 get_ty (HsForAllTy _ ctxt mty)
228 = get_ctxt ctxt `unionUniqSets` get_ty mty
229 get_ty other = panic "TcTyClsDecls:get_ty"
232 = unionManyUniqSets (map get_ty tys)
235 = unionManyUniqSets (map get_sig sigs)
237 get_sig (ClassOpSig _ _ ty _) = get_ty ty
238 get_sig other = panic "TcTyClsDecls:get_sig"
240 set_name name = unitUniqSet (uniqueOf name)
242 set_to_bag set = listToBag (uniqSetToList set)
248 Extract *binding* names from type and class decls. Type variables are
249 bound in type, data, newtype and class declarations and the polytypes
250 in the class op sigs.
252 Why do we need to grab all these type variables at once, including
253 those locally-quantified type variables in class op signatures?
254 Because we can only commit to the final kind of a type variable when
255 we've completed the mutually recursive group. For example:
258 op :: D b => a -> b -> b
261 bop :: (Monad c) => ...
263 Here, the kind of the locally-polymorphic type variable "b"
264 depends on *all the uses of class D*. For example, the use of
265 Monad c in bop's type signature means that D must have kind Type->Type.
269 get_binders :: Bag RenamedHsDecl
270 -> ([HsTyVar Name], -- TyVars; no dups
271 [(Name, Maybe Arity)], -- Tycons; no dups; arities for synonyms
272 [Name]) -- Classes; no dups
274 get_binders decls = (bagToList tyvars, bagToList tycons, bagToList classes)
276 (tyvars, tycons, classes) = foldBag union3 get_binders1
277 (emptyBag,emptyBag,emptyBag)
280 union3 (a1,a2,a3) (b1,b2,b3)
281 = (a1 `unionBags` b1, a2 `unionBags` b2, a3 `unionBags` b3)
283 get_binders1 (TyD (TyData _ _ name tyvars _ _ _ _))
284 = (listToBag tyvars, unitBag (name,Nothing), emptyBag)
285 get_binders1 (TyD (TySynonym name tyvars _ _))
286 = (listToBag tyvars, unitBag (name, Just (length tyvars)), emptyBag)
287 get_binders1 (ClD (ClassDecl _ name tyvar sigs _ _ _))
288 = (unitBag tyvar `unionBags` sigs_tvs sigs,
289 emptyBag, unitBag name)
291 sigs_tvs sigs = unionManyBags (map sig_tvs sigs)
293 sig_tvs (ClassOpSig _ _ ty _) = pty_tvs ty
294 pty_tvs (HsForAllTy tvs _ _) = listToBag tvs -- tvs doesn't include the class tyvar
295 pty_tvs other = emptyBag
300 typeCycleErr syn_cycles sty
301 = vcat (map (pp_cycle sty "Cycle in type declarations ...") syn_cycles)
303 classCycleErr cls_cycles sty
304 = vcat (map (pp_cycle sty "Cycle in class declarations ...") cls_cycles)
306 pp_cycle sty str decls
308 4 (vcat (map pp_decl decls))
311 = hsep [ppr sty name, ppr sty (getSrcLoc name)]
313 name = hsDeclName decl