[project @ 2000-11-24 17:02:01 by simonpj]
[ghc-hetmet.git] / ghc / compiler / typecheck / TcTyClsDecls.lhs
1 %
2 % (c) The AQUA Project, Glasgow University, 1996-1998
3 %
4 \section[TcTyClsDecls]{Typecheck type and class declarations}
5
6 \begin{code}
7 module TcTyClsDecls (
8         tcTyAndClassDecls
9     ) where
10
11 #include "HsVersions.h"
12
13 import CmdLineOpts      ( DynFlags, DynFlag(..), dopt )
14 import HsSyn            ( TyClDecl(..),  
15                           ConDecl(..),   Sig(..), HsPred(..), 
16                           tyClDeclName, hsTyVarNames, 
17                           isIfaceSigDecl, isClassDecl, isSynDecl, isClassOpSig
18                         )
19 import RnHsSyn          ( RenamedTyClDecl, tyClDeclFVs )
20 import BasicTypes       ( RecFlag(..), NewOrData(..), isRec )
21 import HscTypes         ( implicitTyThingIds )
22
23 import TcMonad
24 import TcEnv            ( TcEnv, RecTcEnv, TcTyThing(..), TyThing(..), TyThingDetails(..),
25                           tcExtendKindEnv, tcLookup, tcExtendGlobalEnv, tcExtendGlobalValEnv )
26 import TcTyDecls        ( tcTyDecl1, kcConDetails, mkNewTyConRep )
27 import TcClassDcl       ( tcClassDecl1 )
28 import TcMonoType       ( kcHsTyVars, kcHsType, kcHsBoxedSigType, kcHsContext, mkTyClTyVars )
29 import TcType           ( TcKind, newKindVar, zonkKindEnv )
30
31 import TcUnify          ( unifyKind )
32 import TcInstDcls       ( tcAddDeclCtxt )
33 import Type             ( Kind, mkArrowKind, zipFunTys )
34 import Variance         ( calcTyConArgVrcs )
35 import Class            ( Class, mkClass, classTyCon )
36 import TyCon            ( TyCon, tyConKind, ArgVrcs, AlgTyConFlavour(..), 
37                           mkSynTyCon, mkAlgTyCon, mkClassTyCon )
38 import DataCon          ( isNullaryDataCon )
39 import Var              ( varName )
40 import FiniteMap
41 import Digraph          ( stronglyConnComp, SCC(..) )
42 import Name             ( Name, getSrcLoc, isTyVarName )
43 import Name             ( NameEnv, mkNameEnv, lookupNameEnv_NF )
44 import NameSet
45 import Outputable
46 import Maybes           ( mapMaybe )
47 import ErrUtils         ( Message )
48 import HsDecls          ( getClassDeclSysNames )
49 import Generics         ( mkTyConGenInfo )
50 \end{code}
51
52
53 %************************************************************************
54 %*                                                                      *
55 \subsection{Type checking for type and class declarations}
56 %*                                                                      *
57 %************************************************************************
58
59 The main function
60 ~~~~~~~~~~~~~~~~~
61 \begin{code}
62 tcTyAndClassDecls :: RecTcEnv           -- Knot tying stuff
63                   -> [RenamedTyClDecl]
64                   -> TcM TcEnv
65
66 tcTyAndClassDecls unf_env decls
67   = sortByDependency decls              `thenTc` \ groups ->
68     tcGroups unf_env groups
69
70 tcGroups unf_env []
71   = tcGetEnv    `thenNF_Tc` \ env ->
72     returnTc env
73
74 tcGroups unf_env (group:groups)
75   = tcGroup unf_env group       `thenTc` \ env ->
76     tcSetEnv env                $
77     tcGroups unf_env groups
78 \end{code}
79
80 Dealing with a group
81 ~~~~~~~~~~~~~~~~~~~~
82 Consider a mutually-recursive group, binding 
83 a type constructor T and a class C.
84
85 Step 1:         getInitialKind
86         Construct a KindEnv by binding T and C to a kind variable 
87
88 Step 2:         kcTyClDecl
89         In that environment, do a kind check
90
91 Step 3: Zonk the kinds
92
93 Step 4:         buildTyConOrClass
94         Construct an environment binding T to a TyCon and C to a Class.
95         a) Their kinds comes from zonking the relevant kind variable
96         b) Their arity (for synonyms) comes direct from the decl
97         c) The funcional dependencies come from the decl
98         d) The rest comes a knot-tied binding of T and C, returned from Step 4
99         e) The variances of the tycons in the group is calculated from 
100                 the knot-tied stuff
101
102 Step 5:         tcTyClDecl1
103         In this environment, walk over the decls, constructing the TyCons and Classes.
104         This uses in a strict way items (a)-(c) above, which is why they must
105         be constructed in Step 4. Feed the results back to Step 4.
106         For this step, pass the is-recursive flag as the wimp-out flag
107         to tcTyClDecl1.
108         
109
110 Step 6:         tcTyClDecl1 again
111         For a recursive group only, check all the decls again, just
112         but this time with the wimp flag off.  Now we can check things
113         like whether a function argument is an unboxed tuple, looking
114         through type synonyms properly.  We can't do that in Step 5.
115
116 Step 7:         Extend environment
117         We extend the type environment with bindings not only for the TyCons and Classes,
118         but also for their "implicit Ids" like data constructors and class selectors
119
120 The knot-tying parameters: @rec_details_list@ is an alist mapping @Name@s to
121 @TyThing@s.  @rec_vrcs@ is a finite map from @Name@s to @ArgVrcs@s.
122
123 \begin{code}
124 tcGroup :: RecTcEnv -> SCC RenamedTyClDecl -> TcM TcEnv
125 tcGroup unf_env scc
126   = getDOptsTc                                                  `thenTc` \ dflags ->
127         -- Step 1
128     mapNF_Tc getInitialKind decls                               `thenNF_Tc` \ initial_kinds ->
129
130         -- Step 2
131     tcExtendKindEnv initial_kinds (mapTc kcTyClDecl decls)      `thenTc_`
132
133         -- Step 3
134     zonkKindEnv initial_kinds                   `thenNF_Tc` \ final_kinds ->
135
136         -- Tie the knot
137     fixTc ( \ ~(rec_details_list, _, _) ->
138                 -- Step 4 
139         let
140             kind_env    = mkNameEnv final_kinds
141             rec_details = mkNameEnv rec_details_list
142
143             tyclss, all_tyclss :: [TyThing]
144             tyclss = map (buildTyConOrClass dflags is_rec kind_env 
145                                                    rec_vrcs rec_details) decls
146
147                 -- Add the tycons that come from the classes
148                 -- We want them in the environment because 
149                 -- they are mentioned in interface files
150             all_tyclss  = [ ATyCon (classTyCon clas) | AClass clas <- tyclss]
151                           ++ tyclss
152
153                 -- Calculate variances, and (yes!) feed back into buildTyConOrClass.
154             rec_vrcs    = calcTyConArgVrcs [tc | ATyCon tc <- all_tyclss]
155         in
156                 -- Step 5
157         tcExtendGlobalEnv all_tyclss                    $
158         mapTc (tcTyClDecl1 is_rec unf_env) decls        `thenTc` \ tycls_details ->
159
160                 -- Return results
161         tcGetEnv                                        `thenNF_Tc` \ env ->
162         returnTc (tycls_details, all_tyclss, env)
163     )                                           `thenTc` \ (_, all_tyclss, env) ->
164
165     tcSetEnv env                                $
166
167         -- Step 6
168         -- For a recursive group, check all the types again,
169         -- this time with the wimp flag off
170     (if isRec is_rec then
171         mapTc_ (tcTyClDecl1 NonRecursive unf_env) decls
172      else
173         returnTc ()
174     )                                           `thenTc_`
175
176         -- Step 7
177         -- Extend the environment with the final TyCons/Classes 
178         -- and their implicit Ids
179     tcExtendGlobalValEnv (implicitTyThingIds all_tyclss) tcGetEnv
180
181   where
182     is_rec = case scc of
183                 AcyclicSCC _ -> NonRecursive
184                 CyclicSCC _  -> Recursive
185
186     decls = case scc of
187                 AcyclicSCC decl -> [decl]
188                 CyclicSCC decls -> decls
189
190 tcTyClDecl1 is_rec unf_env decl
191   | isClassDecl decl = tcAddDeclCtxt decl (tcClassDecl1 is_rec unf_env decl)
192   | otherwise        = tcAddDeclCtxt decl (tcTyDecl1    is_rec unf_env decl)
193 \end{code}
194
195
196 %************************************************************************
197 %*                                                                      *
198 \subsection{Step 1: Initial environment}
199 %*                                                                      *
200 %************************************************************************
201
202 \begin{code}
203 getInitialKind :: RenamedTyClDecl -> NF_TcM (Name, TcKind)
204 getInitialKind decl
205  = kcHsTyVars (tcdTyVars decl)  `thenNF_Tc` \ arg_kinds ->
206    newKindVar                   `thenNF_Tc` \ result_kind  ->
207    returnNF_Tc (tcdName decl, mk_kind arg_kinds result_kind)
208
209 mk_kind tvs_w_kinds res_kind = foldr (mkArrowKind . snd) res_kind tvs_w_kinds
210 \end{code}
211
212
213 %************************************************************************
214 %*                                                                      *
215 \subsection{Step 2: Kind checking}
216 %*                                                                      *
217 %************************************************************************
218
219 We need to kind check all types in the mutually recursive group
220 before we know the kind of the type variables.  For example:
221
222 class C a where
223    op :: D b => a -> b -> b
224
225 class D c where
226    bop :: (Monad c) => ...
227
228 Here, the kind of the locally-polymorphic type variable "b"
229 depends on *all the uses of class D*.  For example, the use of
230 Monad c in bop's type signature means that D must have kind Type->Type.
231
232 \begin{code}
233 kcTyClDecl :: RenamedTyClDecl -> TcM ()
234
235 kcTyClDecl decl@(TySynonym {tcdSynRhs = rhs})
236   = kcTyClDeclBody decl         $ \ result_kind ->
237     kcHsType rhs                `thenTc` \ rhs_kind ->
238     unifyKind result_kind rhs_kind
239
240 kcTyClDecl decl@(TyData {tcdND = new_or_data, tcdCtxt = context, tcdCons = con_decls})
241   = kcTyClDeclBody decl                 $ \ result_kind ->
242     kcHsContext context                 `thenTc_` 
243     mapTc_ kc_con_decl con_decls
244   where
245     kc_con_decl (ConDecl _ _ ex_tvs ex_ctxt details loc)
246       = kcHsTyVars ex_tvs               `thenNF_Tc` \ kind_env ->
247         tcExtendKindEnv kind_env        $
248         kcConDetails new_or_data ex_ctxt details
249
250 kcTyClDecl decl@(ClassDecl {tcdCtxt = context,  tcdSigs = class_sigs})
251   = kcTyClDeclBody decl         $ \ result_kind ->
252     kcHsContext context         `thenTc_`
253     mapTc_ kc_sig (filter isClassOpSig class_sigs)
254   where
255     kc_sig (ClassOpSig _ _ op_ty loc) = kcHsBoxedSigType op_ty
256
257 kcTyClDeclBody :: RenamedTyClDecl -> (Kind -> TcM a) -> TcM a
258 -- Extend the env with bindings for the tyvars, taken from
259 -- the kind of the tycon/class.  Give it to the thing inside, and 
260 -- check the result kind matches
261 kcTyClDeclBody decl thing_inside
262   = tcAddDeclCtxt decl          $
263     tcLookup (tcdName decl)     `thenNF_Tc` \ thing ->
264     let
265         kind = case thing of
266                   AGlobal (ATyCon tc) -> tyConKind tc
267                   AGlobal (AClass cl) -> tyConKind (classTyCon cl)
268                   AThing kind         -> kind
269                 -- For some odd reason, a class doesn't include its kind
270
271         (tyvars_w_kinds, result_kind) = zipFunTys (hsTyVarNames (tcdTyVars decl)) kind
272     in
273     tcExtendKindEnv tyvars_w_kinds (thing_inside result_kind)
274 \end{code}
275
276
277 %************************************************************************
278 %*                                                                      *
279 \subsection{Step 4: Building the tycon/class}
280 %*                                                                      *
281 %************************************************************************
282
283 \begin{code}
284 buildTyConOrClass 
285         :: DynFlags
286         -> RecFlag -> NameEnv Kind
287         -> FiniteMap TyCon ArgVrcs -> NameEnv TyThingDetails
288         -> RenamedTyClDecl -> TyThing
289
290 buildTyConOrClass dflags is_rec kenv rec_vrcs rec_details
291                   (TySynonym {tcdName = tycon_name, tcdTyVars = tyvar_names})
292   = ATyCon tycon
293   where
294         tycon = mkSynTyCon tycon_name tycon_kind arity tyvars rhs_ty argvrcs
295         tycon_kind          = lookupNameEnv_NF kenv tycon_name
296         arity               = length tyvar_names
297         tyvars              = mkTyClTyVars tycon_kind tyvar_names
298         SynTyDetails rhs_ty = lookupNameEnv_NF rec_details tycon_name
299         argvrcs             = lookupWithDefaultFM rec_vrcs bogusVrcs tycon
300
301 buildTyConOrClass dflags is_rec kenv rec_vrcs  rec_details
302                   (TyData {tcdND = data_or_new, tcdName = tycon_name, tcdTyVars = tyvar_names,
303                            tcdNCons = nconstrs, tcdSysNames = sys_names})
304   = ATyCon tycon
305   where
306         tycon = mkAlgTyCon tycon_name tycon_kind tyvars ctxt argvrcs
307                            data_cons nconstrs sel_ids
308                            flavour is_rec gen_info
309
310         gen_info | not (dopt Opt_Generics dflags) = Nothing
311                  | otherwise = mkTyConGenInfo tycon sys_names
312
313         DataTyDetails ctxt data_cons sel_ids = lookupNameEnv_NF rec_details tycon_name
314
315         tycon_kind = lookupNameEnv_NF kenv tycon_name
316         tyvars     = mkTyClTyVars tycon_kind tyvar_names
317         argvrcs    = lookupWithDefaultFM rec_vrcs bogusVrcs tycon
318
319         flavour = case data_or_new of
320                         NewType -> NewTyCon (mkNewTyConRep tycon)
321                         DataType | all isNullaryDataCon data_cons -> EnumTyCon
322                                  | otherwise                      -> DataTyCon
323
324 buildTyConOrClass dflags is_rec kenv rec_vrcs  rec_details
325                   (ClassDecl {tcdName = class_name, tcdTyVars = tyvar_names,
326                               tcdFDs = fundeps, tcdSysNames = name_list} )
327   = AClass clas
328   where
329         (tycon_name, _, _, _) = getClassDeclSysNames name_list
330         clas = mkClass class_name tyvars fds
331                        sc_theta sc_sel_ids op_items
332                        tycon
333
334         tycon = mkClassTyCon tycon_name class_kind tyvars
335                              argvrcs dict_con
336                              clas               -- Yes!  It's a dictionary 
337                              flavour
338
339         ClassDetails sc_theta sc_sel_ids op_items dict_con = lookupNameEnv_NF rec_details class_name
340
341         class_kind = lookupNameEnv_NF kenv class_name
342         tyvars     = mkTyClTyVars class_kind tyvar_names
343         argvrcs    = lookupWithDefaultFM rec_vrcs bogusVrcs tycon
344         n_fields   = length sc_sel_ids + length op_items
345
346         flavour | n_fields == 1 = NewTyCon (mkNewTyConRep tycon)
347                 | otherwise     = DataTyCon
348
349         -- We can find the functional dependencies right away, 
350         -- and it is vital to do so. Why?  Because in the next pass
351         -- we check for ambiguity in all the type signatures, and we
352         -- need the functional dependcies to be done by then
353         fds        = [(map lookup xs, map lookup ys) | (xs,ys) <- fundeps]
354         tyvar_env  = mkNameEnv [(varName tv, tv) | tv <- tyvars]
355         lookup     = lookupNameEnv_NF tyvar_env
356
357 bogusVrcs = panic "Bogus tycon arg variances"
358 \end{code}
359
360
361 %************************************************************************
362 %*                                                                      *
363 \subsection{Dependency analysis}
364 %*                                                                      *
365 %************************************************************************
366
367 Dependency analysis
368 ~~~~~~~~~~~~~~~~~~~
369 \begin{code}
370 sortByDependency :: [RenamedTyClDecl] -> TcM [SCC RenamedTyClDecl]
371 sortByDependency decls
372   = let         -- CHECK FOR CLASS CYCLES
373         cls_sccs   = stronglyConnComp (mapMaybe mkClassEdges tycl_decls)
374         cls_cycles = [ decls | CyclicSCC decls <- cls_sccs]
375     in
376     checkTc (null cls_cycles) (classCycleErr cls_cycles)        `thenTc_`
377
378     let         -- CHECK FOR SYNONYM CYCLES
379         syn_sccs   = stronglyConnComp (filter is_syn_decl edges)
380         syn_cycles = [ decls | CyclicSCC decls <- syn_sccs]
381
382     in
383     checkTc (null syn_cycles) (typeCycleErr syn_cycles)         `thenTc_`
384
385         -- DO THE MAIN DEPENDENCY ANALYSIS
386     let
387         decl_sccs  = stronglyConnComp edges
388     in
389     returnTc decl_sccs
390   where
391     tycl_decls = filter (not . isIfaceSigDecl) decls
392     edges      = map mkEdges tycl_decls
393     
394     is_syn_decl (d, _, _) = isSynDecl d
395 \end{code}
396
397 Edges in Type/Class decls
398 ~~~~~~~~~~~~~~~~~~~~~~~~~
399
400 \begin{code}
401 tyClDeclFTVs :: RenamedTyClDecl -> [Name]
402         -- Find the free non-tyvar vars
403 tyClDeclFTVs d = foldNameSet add [] (tyClDeclFVs d)
404                where
405                  add n fvs | isTyVarName n = fvs
406                            | otherwise     = n : fvs
407
408 ----------------------------------------------------
409 -- mk_cls_edges looks only at the context of class decls
410 -- Its used when we are figuring out if there's a cycle in the
411 -- superclass hierarchy
412
413 mkClassEdges :: RenamedTyClDecl -> Maybe (RenamedTyClDecl, Name, [Name])
414
415 mkClassEdges decl@(ClassDecl {tcdCtxt = ctxt, tcdName = name}) = Just (decl, name, [c | HsPClass c _ <- ctxt])
416 mkClassEdges other_decl                                        = Nothing
417
418 mkEdges :: RenamedTyClDecl -> (RenamedTyClDecl, Name, [Name])
419 mkEdges decl = (decl, tyClDeclName decl, tyClDeclFTVs decl)
420 \end{code}
421
422
423 %************************************************************************
424 %*                                                                      *
425 \subsection{Error management
426 %*                                                                      *
427 %************************************************************************
428
429 \begin{code}
430 typeCycleErr, classCycleErr :: [[RenamedTyClDecl]] -> Message
431
432 typeCycleErr syn_cycles
433   = vcat (map (pp_cycle "Cycle in type declarations:") syn_cycles)
434
435 classCycleErr cls_cycles
436   = vcat (map (pp_cycle "Cycle in class declarations:") cls_cycles)
437
438 pp_cycle str decls
439   = hang (text str)
440          4 (vcat (map pp_decl decls))
441   where
442     pp_decl decl
443       = hsep [quotes (ppr name), ptext SLIT("at"), ppr (getSrcLoc name)]
444      where
445         name = tyClDeclName decl
446
447 \end{code}