ae8da7e23137334b90096651b510cef55ffdae0e
[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, kcHsLiftedSigType, 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 NameEnv          ( 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 unlifted 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     traceTc (text "starting" <+> ppr final_kinds)               `thenTc_`
138     fixTc ( \ ~(rec_details_list, _, _) ->
139                 -- Step 4 
140         let
141             kind_env    = mkNameEnv final_kinds
142             rec_details = mkNameEnv rec_details_list
143
144             tyclss, all_tyclss :: [TyThing]
145             tyclss = map (buildTyConOrClass dflags is_rec kind_env 
146                                                    rec_vrcs rec_details) decls
147
148                 -- Add the tycons that come from the classes
149                 -- We want them in the environment because 
150                 -- they are mentioned in interface files
151             all_tyclss  = [ ATyCon (classTyCon clas) | AClass clas <- tyclss]
152                           ++ tyclss
153
154                 -- Calculate variances, and (yes!) feed back into buildTyConOrClass.
155             rec_vrcs    = calcTyConArgVrcs [tc | ATyCon tc <- all_tyclss]
156         in
157                 -- Step 5
158         tcExtendGlobalEnv all_tyclss                    $
159         mapTc (tcTyClDecl1 is_rec unf_env) decls        `thenTc` \ tycls_details ->
160
161                 -- Return results
162         tcGetEnv                                        `thenNF_Tc` \ env ->
163         returnTc (tycls_details, all_tyclss, env)
164     )                                           `thenTc` \ (_, all_tyclss, env) ->
165
166     tcSetEnv env                                $
167
168     traceTc (text "ready for pass 2" <+> ppr (isRec is_rec))                    `thenTc_`
169
170         -- Step 6
171         -- For a recursive group, check all the types again,
172         -- this time with the wimp flag off
173     (if isRec is_rec then
174         mapTc_ (tcTyClDecl1 NonRecursive unf_env) decls
175      else
176         returnTc ()
177     )                                           `thenTc_`
178
179     traceTc (text "done")                       `thenTc_`
180
181         -- Step 7
182         -- Extend the environment with the final TyCons/Classes 
183         -- and their implicit Ids
184     tcExtendGlobalValEnv (implicitTyThingIds all_tyclss) tcGetEnv
185
186   where
187     is_rec = case scc of
188                 AcyclicSCC _ -> NonRecursive
189                 CyclicSCC _  -> Recursive
190
191     decls = case scc of
192                 AcyclicSCC decl -> [decl]
193                 CyclicSCC decls -> decls
194
195 tcTyClDecl1 is_rec unf_env decl
196   | isClassDecl decl = tcAddDeclCtxt decl (tcClassDecl1 is_rec unf_env decl)
197   | otherwise        = tcAddDeclCtxt decl (tcTyDecl1    is_rec unf_env decl)
198 \end{code}
199
200
201 %************************************************************************
202 %*                                                                      *
203 \subsection{Step 1: Initial environment}
204 %*                                                                      *
205 %************************************************************************
206
207 \begin{code}
208 getInitialKind :: RenamedTyClDecl -> NF_TcM (Name, TcKind)
209 getInitialKind decl
210  = kcHsTyVars (tcdTyVars decl)  `thenNF_Tc` \ arg_kinds ->
211    newKindVar                   `thenNF_Tc` \ result_kind  ->
212    returnNF_Tc (tcdName decl, mk_kind arg_kinds result_kind)
213
214 mk_kind tvs_w_kinds res_kind = foldr (mkArrowKind . snd) res_kind tvs_w_kinds
215 \end{code}
216
217
218 %************************************************************************
219 %*                                                                      *
220 \subsection{Step 2: Kind checking}
221 %*                                                                      *
222 %************************************************************************
223
224 We need to kind check all types in the mutually recursive group
225 before we know the kind of the type variables.  For example:
226
227 class C a where
228    op :: D b => a -> b -> b
229
230 class D c where
231    bop :: (Monad c) => ...
232
233 Here, the kind of the locally-polymorphic type variable "b"
234 depends on *all the uses of class D*.  For example, the use of
235 Monad c in bop's type signature means that D must have kind Type->Type.
236
237 \begin{code}
238 kcTyClDecl :: RenamedTyClDecl -> TcM ()
239
240 kcTyClDecl decl@(TySynonym {tcdSynRhs = rhs})
241   = kcTyClDeclBody decl         $ \ result_kind ->
242     kcHsType rhs                `thenTc` \ rhs_kind ->
243     unifyKind result_kind rhs_kind
244
245 kcTyClDecl decl@(TyData {tcdND = new_or_data, tcdCtxt = context, tcdCons = con_decls})
246   = kcTyClDeclBody decl                 $ \ result_kind ->
247     kcHsContext context                 `thenTc_` 
248     mapTc_ kc_con_decl con_decls
249   where
250     kc_con_decl (ConDecl _ _ ex_tvs ex_ctxt details loc)
251       = kcHsTyVars ex_tvs               `thenNF_Tc` \ kind_env ->
252         tcExtendKindEnv kind_env        $
253         kcConDetails new_or_data ex_ctxt details
254
255 kcTyClDecl decl@(ClassDecl {tcdCtxt = context,  tcdSigs = class_sigs})
256   = kcTyClDeclBody decl         $ \ result_kind ->
257     kcHsContext context         `thenTc_`
258     mapTc_ kc_sig (filter isClassOpSig class_sigs)
259   where
260     kc_sig (ClassOpSig _ _ op_ty loc) = kcHsLiftedSigType op_ty
261
262 kcTyClDeclBody :: RenamedTyClDecl -> (Kind -> TcM a) -> TcM a
263 -- Extend the env with bindings for the tyvars, taken from
264 -- the kind of the tycon/class.  Give it to the thing inside, and 
265 -- check the result kind matches
266 kcTyClDeclBody decl thing_inside
267   = tcAddDeclCtxt decl          $
268     tcLookup (tcdName decl)     `thenNF_Tc` \ thing ->
269     let
270         kind = case thing of
271                   AGlobal (ATyCon tc) -> tyConKind tc
272                   AGlobal (AClass cl) -> tyConKind (classTyCon cl)
273                   AThing kind         -> kind
274                 -- For some odd reason, a class doesn't include its kind
275
276         (tyvars_w_kinds, result_kind) = zipFunTys (hsTyVarNames (tcdTyVars decl)) kind
277     in
278     tcExtendKindEnv tyvars_w_kinds (thing_inside result_kind)
279 \end{code}
280
281
282 %************************************************************************
283 %*                                                                      *
284 \subsection{Step 4: Building the tycon/class}
285 %*                                                                      *
286 %************************************************************************
287
288 \begin{code}
289 buildTyConOrClass 
290         :: DynFlags
291         -> RecFlag -> NameEnv Kind
292         -> FiniteMap TyCon ArgVrcs -> NameEnv TyThingDetails
293         -> RenamedTyClDecl -> TyThing
294
295 buildTyConOrClass dflags is_rec kenv rec_vrcs rec_details
296                   (TySynonym {tcdName = tycon_name, tcdTyVars = tyvar_names})
297   = ATyCon tycon
298   where
299         tycon = mkSynTyCon tycon_name tycon_kind arity tyvars rhs_ty argvrcs
300         tycon_kind          = lookupNameEnv_NF kenv tycon_name
301         arity               = length tyvar_names
302         tyvars              = mkTyClTyVars tycon_kind tyvar_names
303         SynTyDetails rhs_ty = lookupNameEnv_NF rec_details tycon_name
304         argvrcs             = lookupWithDefaultFM rec_vrcs bogusVrcs tycon
305
306 buildTyConOrClass dflags is_rec kenv rec_vrcs  rec_details
307                   (TyData {tcdND = data_or_new, tcdName = tycon_name, tcdTyVars = tyvar_names,
308                            tcdNCons = nconstrs, tcdSysNames = sys_names})
309   = ATyCon tycon
310   where
311         tycon = mkAlgTyCon tycon_name tycon_kind tyvars ctxt argvrcs
312                            data_cons nconstrs sel_ids
313                            flavour is_rec gen_info
314
315         gen_info | not (dopt Opt_Generics dflags) = Nothing
316                  | otherwise = mkTyConGenInfo tycon sys_names
317
318         DataTyDetails ctxt data_cons sel_ids = lookupNameEnv_NF rec_details tycon_name
319
320         tycon_kind = lookupNameEnv_NF kenv tycon_name
321         tyvars     = mkTyClTyVars tycon_kind tyvar_names
322         argvrcs    = lookupWithDefaultFM rec_vrcs bogusVrcs tycon
323
324         flavour = case data_or_new of
325                         NewType -> NewTyCon (mkNewTyConRep tycon)
326                         DataType | all isNullaryDataCon data_cons -> EnumTyCon
327                                  | otherwise                      -> DataTyCon
328
329 buildTyConOrClass dflags is_rec kenv rec_vrcs  rec_details
330                   (ClassDecl {tcdName = class_name, tcdTyVars = tyvar_names,
331                               tcdFDs = fundeps, tcdSysNames = name_list} )
332   = AClass clas
333   where
334         (tycon_name, _, _, _) = getClassDeclSysNames name_list
335         clas = mkClass class_name tyvars fds
336                        sc_theta sc_sel_ids op_items
337                        tycon
338
339         tycon = mkClassTyCon tycon_name class_kind tyvars
340                              argvrcs dict_con
341                              clas               -- Yes!  It's a dictionary 
342                              flavour
343
344         ClassDetails sc_theta sc_sel_ids op_items dict_con = lookupNameEnv_NF rec_details class_name
345
346         class_kind = lookupNameEnv_NF kenv class_name
347         tyvars     = mkTyClTyVars class_kind tyvar_names
348         argvrcs    = lookupWithDefaultFM rec_vrcs bogusVrcs tycon
349         n_fields   = length sc_sel_ids + length op_items
350
351         flavour | n_fields == 1 = NewTyCon (mkNewTyConRep tycon)
352                 | otherwise     = DataTyCon
353
354         -- We can find the functional dependencies right away, 
355         -- and it is vital to do so. Why?  Because in the next pass
356         -- we check for ambiguity in all the type signatures, and we
357         -- need the functional dependcies to be done by then
358         fds        = [(map lookup xs, map lookup ys) | (xs,ys) <- fundeps]
359         tyvar_env  = mkNameEnv [(varName tv, tv) | tv <- tyvars]
360         lookup     = lookupNameEnv_NF tyvar_env
361
362 bogusVrcs = panic "Bogus tycon arg variances"
363 \end{code}
364
365
366 %************************************************************************
367 %*                                                                      *
368 \subsection{Dependency analysis}
369 %*                                                                      *
370 %************************************************************************
371
372 Dependency analysis
373 ~~~~~~~~~~~~~~~~~~~
374 \begin{code}
375 sortByDependency :: [RenamedTyClDecl] -> TcM [SCC RenamedTyClDecl]
376 sortByDependency decls
377   = let         -- CHECK FOR CLASS CYCLES
378         cls_sccs   = stronglyConnComp (mapMaybe mkClassEdges tycl_decls)
379         cls_cycles = [ decls | CyclicSCC decls <- cls_sccs]
380     in
381     checkTc (null cls_cycles) (classCycleErr cls_cycles)        `thenTc_`
382
383     let         -- CHECK FOR SYNONYM CYCLES
384         syn_sccs   = stronglyConnComp (filter is_syn_decl edges)
385         syn_cycles = [ decls | CyclicSCC decls <- syn_sccs]
386
387     in
388     checkTc (null syn_cycles) (typeCycleErr syn_cycles)         `thenTc_`
389
390         -- DO THE MAIN DEPENDENCY ANALYSIS
391     let
392         decl_sccs  = stronglyConnComp edges
393     in
394     returnTc decl_sccs
395   where
396     tycl_decls = filter (not . isIfaceSigDecl) decls
397     edges      = map mkEdges tycl_decls
398     
399     is_syn_decl (d, _, _) = isSynDecl d
400 \end{code}
401
402 Edges in Type/Class decls
403 ~~~~~~~~~~~~~~~~~~~~~~~~~
404
405 \begin{code}
406 tyClDeclFTVs :: RenamedTyClDecl -> [Name]
407         -- Find the free non-tyvar vars
408 tyClDeclFTVs d = foldNameSet add [] (tyClDeclFVs d)
409                where
410                  add n fvs | isTyVarName n = fvs
411                            | otherwise     = n : fvs
412
413 ----------------------------------------------------
414 -- mk_cls_edges looks only at the context of class decls
415 -- Its used when we are figuring out if there's a cycle in the
416 -- superclass hierarchy
417
418 mkClassEdges :: RenamedTyClDecl -> Maybe (RenamedTyClDecl, Name, [Name])
419
420 mkClassEdges decl@(ClassDecl {tcdCtxt = ctxt, tcdName = name}) = Just (decl, name, [c | HsClassP c _ <- ctxt])
421 mkClassEdges other_decl                                        = Nothing
422
423 mkEdges :: RenamedTyClDecl -> (RenamedTyClDecl, Name, [Name])
424 mkEdges decl = (decl, tyClDeclName decl, tyClDeclFTVs decl)
425 \end{code}
426
427
428 %************************************************************************
429 %*                                                                      *
430 \subsection{Error management
431 %*                                                                      *
432 %************************************************************************
433
434 \begin{code}
435 typeCycleErr, classCycleErr :: [[RenamedTyClDecl]] -> Message
436
437 typeCycleErr syn_cycles
438   = vcat (map (pp_cycle "Cycle in type declarations:") syn_cycles)
439
440 classCycleErr cls_cycles
441   = vcat (map (pp_cycle "Cycle in class declarations:") cls_cycles)
442
443 pp_cycle str decls
444   = hang (text str)
445          4 (vcat (map pp_decl decls))
446   where
447     pp_decl decl
448       = hsep [quotes (ppr name), ptext SLIT("at"), ppr (getSrcLoc name)]
449      where
450         name = tyClDeclName decl
451
452 \end{code}