ba383d8d1d0fb9f1c0b122b8e54eb9ab9545a946
[ghc-hetmet.git] / compiler / iface / BuildTyCl.lhs
1 %
2 % (c) The University of Glasgow 2006
3 % (c) The GRASP/AQUA Project, Glasgow University, 1992-1998
4 %
5
6 \begin{code}
7 module BuildTyCl (
8         buildSynTyCon, buildAlgTyCon, buildDataCon,
9         buildClass,
10         mkAbstractTyConRhs, mkOpenDataTyConRhs, 
11         mkNewTyConRhs, mkDataTyConRhs, setAssocFamilyPermutation
12     ) where
13
14 #include "HsVersions.h"
15
16 import IfaceEnv
17
18 import DataCon
19 import Var
20 import VarSet
21 import BasicTypes
22 import Name
23 import MkId
24 import Class
25 import TyCon
26 import Type
27 import Coercion
28
29 import TcRnMonad
30 import Util             ( count )
31 import Outputable
32 \end{code}
33         
34
35 \begin{code}
36 ------------------------------------------------------
37 buildSynTyCon :: Name -> [TyVar] 
38               -> SynTyConRhs 
39               -> Kind                   -- Kind of the RHS
40               -> Maybe (TyCon, [Type])  -- family instance if applicable
41               -> TcRnIf m n TyCon
42
43 buildSynTyCon tc_name tvs rhs@(OpenSynTyCon {}) rhs_kind _
44   = let
45       kind = mkArrowKinds (map tyVarKind tvs) rhs_kind
46     in
47     return $ mkSynTyCon tc_name kind tvs rhs NoParentTyCon
48     
49 buildSynTyCon tc_name tvs rhs@(SynonymTyCon {}) rhs_kind mb_family
50   = do { -- We need to tie a knot as the coercion of a data instance depends
51          -- on the instance representation tycon and vice versa.
52        ; tycon <- fixM (\ tycon_rec -> do 
53          { parent <- mkParentInfo mb_family tc_name tvs tycon_rec
54          ; let { tycon   = mkSynTyCon tc_name kind tvs rhs parent
55                ; kind    = mkArrowKinds (map tyVarKind tvs) rhs_kind
56                }
57          ; return tycon
58          })
59        ; return tycon 
60        }
61
62 ------------------------------------------------------
63 buildAlgTyCon :: Name -> [TyVar] 
64               -> ThetaType              -- Stupid theta
65               -> AlgTyConRhs
66               -> RecFlag
67               -> Bool                   -- True <=> want generics functions
68               -> Bool                   -- True <=> was declared in GADT syntax
69               -> Maybe (TyCon, [Type])  -- family instance if applicable
70               -> TcRnIf m n TyCon
71
72 buildAlgTyCon tc_name tvs stupid_theta rhs is_rec want_generics gadt_syn
73               mb_family
74   = do { -- We need to tie a knot as the coercion of a data instance depends
75          -- on the instance representation tycon and vice versa.
76        ; tycon <- fixM (\ tycon_rec -> do 
77          { parent <- mkParentInfo mb_family tc_name tvs tycon_rec
78          ; let { tycon = mkAlgTyCon tc_name kind tvs stupid_theta rhs
79                                     parent is_rec want_generics gadt_syn
80                ; kind  = mkArrowKinds (map tyVarKind tvs) liftedTypeKind
81                }
82          ; return tycon
83          })
84        ; return tycon 
85        }
86
87 -- If a family tycon with instance types is given, the current tycon is an
88 -- instance of that family and we need to
89 --
90 -- (1) create a coercion that identifies the family instance type and the
91 --     representation type from Step (1); ie, it is of the form 
92 --         `Co tvs :: F ts ~ R tvs', where `Co' is the name of the coercion,
93 --         `F' the family tycon and `R' the (derived) representation tycon,
94 --         and
95 -- (2) produce a `TyConParent' value containing the parent and coercion
96 --     information.
97 --
98 mkParentInfo :: Maybe (TyCon, [Type]) 
99              -> Name -> [TyVar] 
100              -> TyCon 
101              -> TcRnIf m n TyConParent
102 mkParentInfo Nothing                  _       _   _         =
103   return NoParentTyCon
104 mkParentInfo (Just (family, instTys)) tc_name tvs rep_tycon =
105   do { -- Create the coercion
106      ; co_tycon_name <- newImplicitBinder tc_name mkInstTyCoOcc
107      ; let co_tycon = mkFamInstCoercion co_tycon_name tvs
108                                         family instTys rep_tycon
109      ; return $ FamilyTyCon family instTys co_tycon
110      }
111     
112 ------------------------------------------------------
113 mkAbstractTyConRhs :: AlgTyConRhs
114 mkAbstractTyConRhs = AbstractTyCon
115
116 mkOpenDataTyConRhs :: AlgTyConRhs
117 mkOpenDataTyConRhs = OpenTyCon Nothing
118
119 mkDataTyConRhs :: [DataCon] -> AlgTyConRhs
120 mkDataTyConRhs cons
121   = DataTyCon { data_cons = cons, is_enum = all isNullarySrcDataCon cons }
122
123 mkNewTyConRhs :: Name -> TyCon -> DataCon -> TcRnIf m n AlgTyConRhs
124 -- Monadic because it makes a Name for the coercion TyCon
125 -- We pass the Name of the parent TyCon, as well as the TyCon itself,
126 -- because the latter is part of a knot, whereas the former is not.
127 mkNewTyConRhs tycon_name tycon con 
128   = do  { co_tycon_name <- newImplicitBinder tycon_name mkNewTyCoOcc
129         ; let co_tycon = mkNewTypeCoercion co_tycon_name tycon etad_tvs etad_rhs
130               cocon_maybe | all_coercions || isRecursiveTyCon tycon 
131                           = Just co_tycon
132                           | otherwise              
133                           = Nothing
134         ; traceIf (text "mkNewTyConRhs" <+> ppr cocon_maybe)
135         ; return (NewTyCon { data_con    = con, 
136                              nt_rhs      = rhs_ty,
137                              nt_etad_rhs = (etad_tvs, etad_rhs),
138                              nt_co       = cocon_maybe } ) }
139                              -- Coreview looks through newtypes with a Nothing
140                              -- for nt_co, or uses explicit coercions otherwise
141   where
142         -- If all_coercions is True then we use coercions for all newtypes
143         -- otherwise we use coercions for recursive newtypes and look through
144         -- non-recursive newtypes
145     all_coercions = True
146     tvs    = tyConTyVars tycon
147     inst_con_ty = applyTys (dataConUserType con) (mkTyVarTys tvs)
148     rhs_ty = ASSERT( isFunTy inst_con_ty ) funArgTy inst_con_ty
149         -- Instantiate the data con with the 
150         -- type variables from the tycon
151         -- NB: a newtype DataCon has a type that must look like
152         --        forall tvs.  <arg-ty> -> T tvs
153         -- Note that we *can't* use dataConInstOrigArgTys here because
154         -- the newtype arising from   class Foo a => Bar a where {}
155         -- has a single argument (Foo a) that is a *type class*, so
156         -- dataConInstOrigArgTys returns [].
157
158     etad_tvs :: [TyVar] -- Matched lazily, so that mkNewTypeCoercion can
159     etad_rhs :: Type    -- return a TyCon without pulling on rhs_ty
160                         -- See Note [Tricky iface loop] in LoadIface
161     (etad_tvs, etad_rhs) = eta_reduce (reverse tvs) rhs_ty
162  
163     eta_reduce :: [TyVar]               -- Reversed
164                -> Type                  -- Rhs type
165                -> ([TyVar], Type)       -- Eta-reduced version (tyvars in normal order)
166     eta_reduce (a:as) ty | Just (fun, arg) <- splitAppTy_maybe ty,
167                            Just tv <- getTyVar_maybe arg,
168                            tv == a,
169                            not (a `elemVarSet` tyVarsOfType fun)
170                          = eta_reduce as fun
171     eta_reduce tvs ty = (reverse tvs, ty)
172                                 
173
174 setAssocFamilyPermutation :: [TyVar] -> TyThing -> TyThing
175 setAssocFamilyPermutation clas_tvs (ATyCon tc) 
176   = ATyCon (setTyConArgPoss clas_tvs tc)
177 setAssocFamilyPermutation _clas_tvs other
178   = pprPanic "setAssocFamilyPermutation" (ppr other)
179
180
181 ------------------------------------------------------
182 buildDataCon :: Name -> Bool
183             -> [StrictnessMark] 
184             -> [Name]                   -- Field labels
185             -> [TyVar] -> [TyVar]       -- Univ and ext 
186             -> [(TyVar,Type)]           -- Equality spec
187             -> ThetaType                -- Does not include the "stupid theta"
188                                         -- or the GADT equalities
189             -> [Type] -> Type           -- Argument and result types
190             -> TyCon                    -- Rep tycon
191             -> TcRnIf m n DataCon
192 -- A wrapper for DataCon.mkDataCon that
193 --   a) makes the worker Id
194 --   b) makes the wrapper Id if necessary, including
195 --      allocating its unique (hence monadic)
196 buildDataCon src_name declared_infix arg_stricts field_lbls
197              univ_tvs ex_tvs eq_spec ctxt arg_tys res_ty rep_tycon
198   = do  { wrap_name <- newImplicitBinder src_name mkDataConWrapperOcc
199         ; work_name <- newImplicitBinder src_name mkDataConWorkerOcc
200         -- This last one takes the name of the data constructor in the source
201         -- code, which (for Haskell source anyway) will be in the DataName name
202         -- space, and puts it into the VarName name space
203
204         ; let
205                 stupid_ctxt = mkDataConStupidTheta rep_tycon arg_tys univ_tvs
206                 data_con = mkDataCon src_name declared_infix
207                                      arg_stricts field_lbls
208                                      univ_tvs ex_tvs eq_spec ctxt
209                                      arg_tys res_ty rep_tycon
210                                      stupid_ctxt dc_ids
211                 dc_ids = mkDataConIds wrap_name work_name data_con
212
213         ; return data_con }
214
215
216 -- The stupid context for a data constructor should be limited to
217 -- the type variables mentioned in the arg_tys
218 -- ToDo: Or functionally dependent on?  
219 --       This whole stupid theta thing is, well, stupid.
220 mkDataConStupidTheta :: TyCon -> [Type] -> [TyVar] -> [PredType]
221 mkDataConStupidTheta tycon arg_tys univ_tvs
222   | null stupid_theta = []      -- The common case
223   | otherwise         = filter in_arg_tys stupid_theta
224   where
225     tc_subst     = zipTopTvSubst (tyConTyVars tycon) (mkTyVarTys univ_tvs)
226     stupid_theta = substTheta tc_subst (tyConStupidTheta tycon)
227         -- Start by instantiating the master copy of the 
228         -- stupid theta, taken from the TyCon
229
230     arg_tyvars      = tyVarsOfTypes arg_tys
231     in_arg_tys pred = not $ isEmptyVarSet $ 
232                       tyVarsOfPred pred `intersectVarSet` arg_tyvars
233 \end{code}
234
235
236 ------------------------------------------------------
237 \begin{code}
238 buildClass :: Bool                      -- True <=> do not include unfoldings 
239                                         --          on dict selectors
240                                         -- Used when importing a class without -O
241            -> Name -> [TyVar] -> ThetaType
242            -> [FunDep TyVar]            -- Functional dependencies
243            -> [TyThing]                 -- Associated types
244            -> [(Name, DefMeth, Type)]   -- Method info
245            -> RecFlag                   -- Info for type constructor
246            -> TcRnIf m n Class
247
248 buildClass no_unf class_name tvs sc_theta fds ats sig_stuff tc_isrec
249   = do  { traceIf (text "buildClass")
250         ; tycon_name <- newImplicitBinder class_name mkClassTyConOcc
251         ; datacon_name <- newImplicitBinder class_name mkClassDataConOcc
252                 -- The class name is the 'parent' for this datacon, not its tycon,
253                 -- because one should import the class to get the binding for 
254                 -- the datacon
255
256         ; fixM (\ rec_clas -> do {      -- Only name generation inside loop
257
258           let { rec_tycon  = classTyCon rec_clas
259               ; op_tys     = [ty | (_,_,ty) <- sig_stuff]
260               ; op_names   = [op | (op,_,_) <- sig_stuff]
261               ; op_items   = [ (mkDictSelId no_unf op_name rec_clas, dm_info)
262                              | (op_name, dm_info, _) <- sig_stuff ] }
263                         -- Build the selector id and default method id
264
265         ; let n_value_preds   = count (not . isEqPred) sc_theta
266               all_value_preds = n_value_preds == length sc_theta
267               -- We only make selectors for the *value* superclasses, 
268               -- not equality predicates 
269
270         ; sc_sel_names <- mapM  (newImplicitBinder class_name . mkSuperDictSelOcc) 
271                                 [1..n_value_preds]
272         ; let sc_sel_ids = [mkDictSelId no_unf sc_name rec_clas | sc_name <- sc_sel_names]
273               -- We number off the Dict superclass selectors, 1, 2, 3 etc so that we 
274               -- can construct names for the selectors. Thus
275               --      class (C a, C b) => D a b where ...
276               -- gives superclass selectors
277               --      D_sc1, D_sc2
278               -- (We used to call them D_C, but now we can have two different
279               --  superclasses both called C!)
280               --
281         
282         ; let use_newtype = (n_value_preds + length sig_stuff == 1) && all_value_preds
283                 -- Use a newtype if the data constructor has 
284                 --      (a) exactly one value field
285                 --      (b) no existential or equality-predicate fields
286                 -- i.e. exactly one operation or superclass taken together
287                 -- See note [Class newtypes and equality predicates]
288
289                 -- We play a bit fast and loose by treating the superclasses
290                 -- as ordinary arguments.  That means that in the case of
291                 --     class C a => D a
292                 -- we don't get a newtype with no arguments!
293               args    = sc_sel_names ++ op_names
294               arg_tys = map mkPredTy sc_theta ++ op_tys
295
296         ; dict_con <- buildDataCon datacon_name
297                                    False        -- Not declared infix
298                                    (map (const NotMarkedStrict) args)
299                                    [{- No fields -}]
300                                    tvs [{- no existentials -}]
301                                    [{- No GADT equalities -}] [{- No theta -}]
302                                    arg_tys
303                                    (mkTyConApp rec_tycon (mkTyVarTys tvs))
304                                    rec_tycon
305
306         ; rhs <- if use_newtype
307                  then mkNewTyConRhs tycon_name rec_tycon dict_con
308                  else return (mkDataTyConRhs [dict_con])
309
310         ; let { clas_kind = mkArrowKinds (map tyVarKind tvs) liftedTypeKind
311
312               ; tycon = mkClassTyCon tycon_name clas_kind tvs
313                                      rhs rec_clas tc_isrec
314                 -- A class can be recursive, and in the case of newtypes 
315                 -- this matters.  For example
316                 --      class C a where { op :: C b => a -> b -> Int }
317                 -- Because C has only one operation, it is represented by
318                 -- a newtype, and it should be a *recursive* newtype.
319                 -- [If we don't make it a recursive newtype, we'll expand the
320                 -- newtype like a synonym, but that will lead to an infinite
321                 -- type]
322               ; atTyCons = [tycon | ATyCon tycon <- ats]
323
324               ; result = mkClass class_name tvs fds 
325                                  sc_theta sc_sel_ids atTyCons
326                                  op_items tycon
327               }
328         ; traceIf (text "buildClass" <+> ppr tycon) 
329         ; return result
330         })}
331 \end{code}
332
333 Note [Class newtypes and equality predicates]
334 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
335 Consider
336         class (a ~ F b) => C a b where
337           op :: a -> b
338
339 We cannot represent this by a newtype, even though it's not
340 existential, and there's only one value field, because we do
341 capture an equality predicate:
342
343         data C a b where
344           MkC :: forall a b. (a ~ F b) => (a->b) -> C a b
345
346 We need to access this equality predicate when we get passes a C
347 dictionary.  See Trac #2238
348