2 % (c) The AQUA Project, Glasgow University, 1996-1998
4 \section[TcTyClsDecls]{Typecheck type and class declarations}
11 #include "HsVersions.h"
13 import HsSyn ( HsDecl(..), TyClDecl(..),
17 tyClDeclName, hsTyVarNames,
18 isIfaceSigDecl, isClassDecl, isSynDecl, isClassOpSig
20 import RnHsSyn ( RenamedHsDecl, RenamedTyClDecl, tyClDeclFVs )
21 import BasicTypes ( RecFlag(..), NewOrData(..) )
24 import TcEnv ( TcEnv, TyThing(..), TyThingDetails(..),
25 tcExtendKindEnv, tcLookupGlobal, tcExtendGlobalEnv )
26 import TcTyDecls ( tcTyDecl1, kcConDetails, mkNewTyConRep )
27 import TcClassDcl ( tcClassDecl1 )
28 import TcMonoType ( kcHsTyVars, kcHsType, kcHsBoxedSigType, kcHsContext, mkTyClTyVars )
29 import TcType ( TcKind, newKindVar, zonkKindEnv )
31 import TcUnify ( unifyKind )
32 import TcInstDcls ( tcAddDeclCtxt )
33 import Type ( Kind, mkArrowKind, boxedTypeKind, zipFunTys )
34 import Variance ( calcTyConArgVrcs )
35 import Class ( Class, mkClass, classTyCon )
36 import TyCon ( TyCon, tyConKind, ArgVrcs, AlgTyConFlavour(..),
37 mkSynTyCon, mkAlgTyConRep, mkClassTyCon )
38 import DataCon ( isNullaryDataCon )
39 import Var ( varName )
41 import Digraph ( stronglyConnComp, SCC(..) )
42 import Name ( Name, NamedThing(..), NameEnv, getSrcLoc,
43 mkNameEnv, lookupNameEnv_NF, isTyVarName
47 import Maybes ( mapMaybe )
48 import ErrUtils ( Message )
49 import HsDecls ( getClassDeclSysNames )
50 import Generics ( mkTyConGenInfo )
51 import CmdLineOpts ( DynFlags )
55 %************************************************************************
57 \subsection{Type checking for type and class declarations}
59 %************************************************************************
64 tcTyAndClassDecls :: TcEnv -- Knot tying stuff
68 tcTyAndClassDecls unf_env decls
69 = sortByDependency decls `thenTc` \ groups ->
70 tcGroups unf_env groups
73 = tcGetEnv `thenNF_Tc` \ env ->
76 tcGroups unf_env (group:groups)
77 = tcGroup unf_env group `thenTc` \ env ->
79 tcGroups unf_env groups
84 Consider a mutually-recursive group, binding
85 a type constructor T and a class C.
87 Step 1: getInitialKind
88 Construct a KindEnv by binding T and C to a kind variable
91 In that environment, do a kind check
93 Step 3: Zonk the kinds
95 Step 4: buildTyConOrClass
96 Construct an environment binding T to a TyCon and C to a Class.
97 a) Their kinds comes from zonking the relevant kind variable
98 b) Their arity (for synonyms) comes direct from the decl
99 c) The funcional dependencies come from the decl
100 d) The rest comes a knot-tied binding of T and C, returned from Step 4
101 e) The variances of the tycons in the group is calculated from
105 In this environment, walk over the decls, constructing the TyCons and Classes.
106 This uses in a strict way items (a)-(c) above, which is why they must
107 be constructed in Step 4.
108 Feed the results back to Step 4.
110 The knot-tying parameters: @rec_details_list@ is an alist mapping @Name@s to
111 @TyThing@s. @rec_vrcs@ is a finite map from @Name@s to @ArgVrcs@s.
114 tcGroup :: TcEnv -> SCC RenamedTyClDecl -> TcM TcEnv
116 = getDOptsTc `thenTc` \ dflags ->
118 mapNF_Tc getInitialKind decls `thenNF_Tc` \ initial_kinds ->
121 tcExtendKindEnv initial_kinds (mapTc kcTyClDecl decls) `thenTc_`
124 zonkKindEnv initial_kinds `thenNF_Tc` \ final_kinds ->
127 fixTc ( \ ~(rec_details_list, _) ->
130 kind_env = mkNameEnv final_kinds
131 rec_details = mkNameEnv rec_details_list
133 tyclss, all_tyclss :: [(Name, TyThing)]
134 tyclss = map (buildTyConOrClass dflags is_rec kind_env
135 rec_vrcs rec_details) decls
137 -- Add the tycons that come from the classes
138 -- We want them in the environment because
139 -- they are mentioned in interface files
140 all_tyclss = [ (getName tycon, ATyCon tycon) | (_, AClass clas) <- tyclss,
141 let tycon = classTyCon clas
144 -- Calculate variances, and (yes!) feed back into buildTyConOrClass.
145 rec_vrcs = calcTyConArgVrcs [tc | (_, ATyCon tc) <- all_tyclss]
148 tcExtendGlobalEnv all_tyclss $
149 mapTc (tcTyClDecl1 unf_env) decls `thenTc` \ tycls_details ->
150 tcGetEnv `thenNF_Tc` \ env ->
151 returnTc (tycls_details, env)
152 ) `thenTc` \ (_, env) ->
156 AcyclicSCC _ -> NonRecursive
157 CyclicSCC _ -> Recursive
160 AcyclicSCC decl -> [decl]
161 CyclicSCC decls -> decls
163 tcTyClDecl1 unf_env decl
164 = tcAddDeclCtxt decl $
165 if isClassDecl decl then
166 tcClassDecl1 unf_env decl
172 %************************************************************************
174 \subsection{Step 1: Initial environment}
176 %************************************************************************
179 getInitialKind :: RenamedTyClDecl -> NF_TcM (Name, TcKind)
180 getInitialKind (TySynonym name tyvars _ _)
181 = kcHsTyVars tyvars `thenNF_Tc` \ arg_kinds ->
182 newKindVar `thenNF_Tc` \ result_kind ->
183 returnNF_Tc (name, mk_kind arg_kinds result_kind)
185 getInitialKind (TyData _ _ name tyvars _ _ _ _ _ _)
186 = kcHsTyVars tyvars `thenNF_Tc` \ arg_kinds ->
187 returnNF_Tc (name, mk_kind arg_kinds boxedTypeKind)
189 getInitialKind (ClassDecl _ name tyvars _ _ _ _ _ )
190 = kcHsTyVars tyvars `thenNF_Tc` \ arg_kinds ->
191 returnNF_Tc (name, mk_kind arg_kinds boxedTypeKind)
193 mk_kind tvs_w_kinds res_kind = foldr (mkArrowKind . snd) res_kind tvs_w_kinds
197 %************************************************************************
199 \subsection{Step 2: Kind checking}
201 %************************************************************************
203 We need to kind check all types in the mutually recursive group
204 before we know the kind of the type variables. For example:
207 op :: D b => a -> b -> b
210 bop :: (Monad c) => ...
212 Here, the kind of the locally-polymorphic type variable "b"
213 depends on *all the uses of class D*. For example, the use of
214 Monad c in bop's type signature means that D must have kind Type->Type.
217 kcTyClDecl :: RenamedTyClDecl -> TcM ()
219 kcTyClDecl decl@(TySynonym tycon_name hs_tyvars rhs loc)
220 = tcAddDeclCtxt decl $
221 kcTyClDeclBody tycon_name hs_tyvars $ \ result_kind ->
222 kcHsType rhs `thenTc` \ rhs_kind ->
223 unifyKind result_kind rhs_kind
225 kcTyClDecl decl@(TyData _ context tycon_name hs_tyvars con_decls _ _ loc _ _)
226 = tcAddDeclCtxt decl $
227 kcTyClDeclBody tycon_name hs_tyvars $ \ result_kind ->
228 kcHsContext context `thenTc_`
229 mapTc_ kc_con_decl con_decls
231 kc_con_decl (ConDecl _ _ ex_tvs ex_ctxt details loc)
233 kcHsTyVars ex_tvs `thenNF_Tc` \ kind_env ->
234 tcExtendKindEnv kind_env $
235 kcConDetails ex_ctxt details
237 kcTyClDecl decl@(ClassDecl context class_name
238 hs_tyvars fundeps class_sigs
240 = tcAddDeclCtxt decl $
241 kcTyClDeclBody class_name hs_tyvars $ \ result_kind ->
242 kcHsContext context `thenTc_`
243 mapTc_ kc_sig (filter isClassOpSig class_sigs)
245 kc_sig (ClassOpSig _ _ op_ty loc) = tcAddSrcLoc loc (kcHsBoxedSigType op_ty)
247 kcTyClDeclBody :: Name -> [HsTyVarBndr Name] -- Kind of the tycon/cls and its tyvars
248 -> (Kind -> TcM a) -- Thing inside
250 -- Extend the env with bindings for the tyvars, taken from
251 -- the kind of the tycon/class. Give it to the thing inside, and
252 -- check the result kind matches
253 kcTyClDeclBody tc_name hs_tyvars thing_inside
254 = tcLookupGlobal tc_name `thenNF_Tc` \ thing ->
257 ATyCon tc -> tyConKind tc
258 AClass cl -> tyConKind (classTyCon cl)
259 -- For some odd reason, a class doesn't include its kind
261 (tyvars_w_kinds, result_kind) = zipFunTys (hsTyVarNames hs_tyvars) kind
263 tcExtendKindEnv tyvars_w_kinds (thing_inside result_kind)
267 %************************************************************************
269 \subsection{Step 4: Building the tycon/class}
271 %************************************************************************
276 -> RecFlag -> NameEnv Kind
277 -> FiniteMap TyCon ArgVrcs -> NameEnv TyThingDetails
278 -> RenamedTyClDecl -> (Name, TyThing)
279 -- Can't fail; the only reason it's in the monad
280 -- is so it can zonk the kinds
282 buildTyConOrClass dflags is_rec kenv rec_vrcs rec_details
283 (TySynonym tycon_name tyvar_names rhs src_loc)
284 = (tycon_name, ATyCon tycon)
286 tycon = mkSynTyCon tycon_name tycon_kind arity tyvars rhs_ty argvrcs
287 tycon_kind = lookupNameEnv_NF kenv tycon_name
288 arity = length tyvar_names
289 tyvars = mkTyClTyVars tycon_kind tyvar_names
290 SynTyDetails rhs_ty = lookupNameEnv_NF rec_details tycon_name
291 argvrcs = lookupWithDefaultFM rec_vrcs bogusVrcs tycon
293 buildTyConOrClass dflags is_rec kenv rec_vrcs rec_details
294 (TyData data_or_new context tycon_name tyvar_names _ nconstrs _ src_loc name1 name2)
295 = (tycon_name, ATyCon tycon)
297 tycon = mkAlgTyConRep tycon_name tycon_kind tyvars ctxt argvrcs
300 flavour is_rec gen_info
301 gen_info = mkTyConGenInfo dflags tycon name1 name2
303 DataTyDetails ctxt data_cons derived_classes = lookupNameEnv_NF rec_details tycon_name
305 tycon_kind = lookupNameEnv_NF kenv tycon_name
306 tyvars = mkTyClTyVars tycon_kind tyvar_names
307 argvrcs = lookupWithDefaultFM rec_vrcs bogusVrcs tycon
309 flavour = case data_or_new of
310 NewType -> NewTyCon (mkNewTyConRep tycon)
311 DataType | all isNullaryDataCon data_cons -> EnumTyCon
312 | otherwise -> DataTyCon
314 buildTyConOrClass dflags is_rec kenv rec_vrcs rec_details
315 (ClassDecl context class_name
316 tyvar_names fundeps class_sigs def_methods
318 = (class_name, AClass clas)
320 (tycon_name, _, _, _) = getClassDeclSysNames name_list
321 clas = mkClass class_name tyvars fds
322 sc_theta sc_sel_ids op_items
325 tycon = mkClassTyCon tycon_name class_kind tyvars
327 clas -- Yes! It's a dictionary
330 ClassDetails sc_theta sc_sel_ids op_items dict_con = lookupNameEnv_NF rec_details class_name
332 class_kind = lookupNameEnv_NF kenv class_name
333 tyvars = mkTyClTyVars class_kind tyvar_names
334 argvrcs = lookupWithDefaultFM rec_vrcs bogusVrcs tycon
335 n_fields = length sc_sel_ids + length op_items
337 flavour | n_fields == 1 = NewTyCon (mkNewTyConRep tycon)
338 | otherwise = DataTyCon
340 -- We can find the functional dependencies right away,
341 -- and it is vital to do so. Why? Because in the next pass
342 -- we check for ambiguity in all the type signatures, and we
343 -- need the functional dependcies to be done by then
344 fds = [(map lookup xs, map lookup ys) | (xs,ys) <- fundeps]
345 tyvar_env = mkNameEnv [(varName tv, tv) | tv <- tyvars]
346 lookup = lookupNameEnv_NF tyvar_env
348 bogusVrcs = panic "Bogus tycon arg variances"
352 %************************************************************************
354 \subsection{Dependency analysis}
356 %************************************************************************
361 sortByDependency :: [RenamedHsDecl] -> TcM [SCC RenamedTyClDecl]
362 sortByDependency decls
363 = let -- CHECK FOR CLASS CYCLES
364 cls_sccs = stronglyConnComp (mapMaybe mkClassEdges tycl_decls)
365 cls_cycles = [ decls | CyclicSCC decls <- cls_sccs]
367 checkTc (null cls_cycles) (classCycleErr cls_cycles) `thenTc_`
369 let -- CHECK FOR SYNONYM CYCLES
370 syn_sccs = stronglyConnComp (filter is_syn_decl edges)
371 syn_cycles = [ decls | CyclicSCC decls <- syn_sccs]
374 checkTc (null syn_cycles) (typeCycleErr syn_cycles) `thenTc_`
376 -- DO THE MAIN DEPENDENCY ANALYSIS
378 decl_sccs = stronglyConnComp edges
382 tycl_decls = [d | TyClD d <- decls, not (isIfaceSigDecl d)]
383 edges = map mkEdges tycl_decls
385 is_syn_decl (d, _, _) = isSynDecl d
388 Edges in Type/Class decls
389 ~~~~~~~~~~~~~~~~~~~~~~~~~
392 tyClDeclFTVs :: RenamedTyClDecl -> [Name]
393 tyClDeclFTVs d = foldNameSet add [] (tyClDeclFVs d)
395 add n fvs | isTyVarName n = fvs
396 | otherwise = n : fvs
398 ----------------------------------------------------
399 -- mk_cls_edges looks only at the context of class decls
400 -- Its used when we are figuring out if there's a cycle in the
401 -- superclass hierarchy
403 mkClassEdges :: RenamedTyClDecl -> Maybe (RenamedTyClDecl, Name, [Name])
405 mkClassEdges decl@(ClassDecl ctxt name _ _ _ _ _ _) = Just (decl, name, [c | HsPClass c _ <- ctxt])
406 mkClassEdges other_decl = Nothing
408 ----------------------------------------------------
409 mkEdges :: RenamedTyClDecl -> (RenamedTyClDecl, Name, [Name])
410 mkEdges decl = (decl, tyClDeclName decl, tyClDeclFTVs decl)
414 %************************************************************************
416 \subsection{Error management
418 %************************************************************************
421 typeCycleErr, classCycleErr :: [[RenamedTyClDecl]] -> Message
423 typeCycleErr syn_cycles
424 = vcat (map (pp_cycle "Cycle in type declarations:") syn_cycles)
426 classCycleErr cls_cycles
427 = vcat (map (pp_cycle "Cycle in class declarations:") cls_cycles)
431 4 (vcat (map pp_decl decls))
434 = hsep [quotes (ppr name), ptext SLIT("at"), ppr (getSrcLoc name)]
436 name = tyClDeclName decl