Remove the distinction between data and newtype families
[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 
12     ) where
13
14 #include "HsVersions.h"
15
16 import IfaceEnv
17 import TcRnMonad
18
19 import DataCon
20 import Var
21 import VarSet
22 import TysWiredIn
23 import BasicTypes
24 import Name
25 import OccName
26 import MkId
27 import Class
28 import TyCon
29 import Type
30 import Coercion
31
32 import Data.List
33 \end{code}
34         
35
36 \begin{code}
37 ------------------------------------------------------
38 buildSynTyCon :: Name -> [TyVar] 
39               -> SynTyConRhs 
40               -> Maybe (TyCon, [Type])  -- family instance if applicable
41               -> TcRnIf m n TyCon
42
43 buildSynTyCon tc_name tvs rhs@(OpenSynTyCon rhs_ki _) _
44   = let
45       kind = mkArrowKinds (map tyVarKind tvs) rhs_ki
46     in
47     return $ mkSynTyCon tc_name kind tvs rhs NoParentTyCon
48     
49 buildSynTyCon tc_name tvs rhs@(SynonymTyCon rhs_ty) 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) (typeKind rhs_ty)
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                                     fields parent is_rec want_generics gadt_syn
80                ; kind    = mkArrowKinds (map tyVarKind tvs) liftedTypeKind
81                ; fields  = mkTyConSelIds tycon rhs
82                }
83          ; return tycon
84          })
85        ; return tycon 
86        }
87
88 -- If a family tycon with instance types is given, the current tycon is an
89 -- instance of that family and we need to
90 --
91 -- (1) create a coercion that identifies the family instance type and the
92 --     representation type from Step (1); ie, it is of the form 
93 --         `Co tvs :: F ts :=: R tvs', where `Co' is the name of the coercion,
94 --         `F' the family tycon and `R' the (derived) representation tycon,
95 --         and
96 -- (2) produce a `TyConParent' value containing the parent and coercion
97 --     information.
98 --
99 mkParentInfo :: Maybe (TyCon, [Type]) 
100              -> Name -> [TyVar] 
101              -> TyCon 
102              -> TcRnIf m n TyConParent
103 mkParentInfo Nothing                  _       _   _         =
104   return NoParentTyCon
105 mkParentInfo (Just (family, instTys)) tc_name tvs rep_tycon =
106   do { -- Create the coercion
107      ; co_tycon_name <- newImplicitBinder tc_name mkInstTyCoOcc
108      ; let co_tycon = mkFamInstCoercion co_tycon_name tvs
109                                         family instTys rep_tycon
110      ; return $ FamilyTyCon family instTys co_tycon
111      }
112     
113 ------------------------------------------------------
114 mkAbstractTyConRhs :: AlgTyConRhs
115 mkAbstractTyConRhs = AbstractTyCon
116
117 mkOpenDataTyConRhs :: AlgTyConRhs
118 mkOpenDataTyConRhs = OpenTyCon Nothing
119
120 mkDataTyConRhs :: [DataCon] -> AlgTyConRhs
121 mkDataTyConRhs cons
122   = DataTyCon { data_cons = cons, is_enum = all isNullarySrcDataCon cons }
123
124 mkNewTyConRhs :: Name -> TyCon -> DataCon -> TcRnIf m n AlgTyConRhs
125 -- Monadic because it makes a Name for the coercion TyCon
126 -- We pass the Name of the parent TyCon, as well as the TyCon itself,
127 -- because the latter is part of a knot, whereas the former is not.
128 mkNewTyConRhs tycon_name tycon con 
129   = do  { co_tycon_name <- newImplicitBinder tycon_name mkNewTyCoOcc
130         ; let co_tycon = mkNewTypeCoercion co_tycon_name tycon etad_tvs etad_rhs
131               cocon_maybe | all_coercions || isRecursiveTyCon tycon 
132                           = Just co_tycon
133                           | otherwise              
134                           = Nothing
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                              nt_rep = mkNewTyConRep tycon rhs_ty }) }
142   where
143         -- If all_coercions is True then we use coercions for all newtypes
144         -- otherwise we use coercions for recursive newtypes and look through
145         -- non-recursive newtypes
146     all_coercions = True
147     tvs    = tyConTyVars tycon
148     rhs_ty = head (dataConInstOrigArgTys con (mkTyVarTys tvs))
149         -- Instantiate the data con with the 
150         -- type variables from the tycon
151
152     etad_tvs :: [TyVar] -- Matched lazily, so that mkNewTypeCoercion can
153     etad_rhs :: Type    -- return a TyCon without pulling on rhs_ty
154                         -- See Note [Tricky iface loop] in LoadIface
155     (etad_tvs, etad_rhs) = eta_reduce (reverse tvs) rhs_ty
156  
157     eta_reduce :: [TyVar]               -- Reversed
158                -> Type                  -- Rhs type
159                -> ([TyVar], Type)       -- Eta-reduced version (tyvars in normal order)
160     eta_reduce (a:as) ty | Just (fun, arg) <- splitAppTy_maybe ty,
161                            Just tv <- getTyVar_maybe arg,
162                            tv == a,
163                            not (a `elemVarSet` tyVarsOfType fun)
164                          = eta_reduce as fun
165     eta_reduce tvs ty = (reverse tvs, ty)
166                                 
167
168 mkNewTyConRep :: TyCon          -- The original type constructor
169               -> Type           -- The arg type of its constructor
170               -> Type           -- Chosen representation type
171 -- The "representation type" is guaranteed not to be another newtype
172 -- at the outermost level; but it might have newtypes in type arguments
173
174 -- Find the representation type for this newtype TyCon
175 -- Remember that the representation type is the *ultimate* representation
176 -- type, looking through other newtypes.
177 -- 
178 -- splitTyConApp_maybe no longer looks through newtypes, so we must
179 -- deal explicitly with this case
180 -- 
181 -- The trick is to to deal correctly with recursive newtypes
182 -- such as      newtype T = MkT T
183
184 mkNewTyConRep tc rhs_ty
185   | null (tyConDataCons tc) = unitTy
186         -- External Core programs can have newtypes with no data constructors
187   | otherwise               = go [tc] rhs_ty
188   where
189         -- Invariant: tcs have been seen before
190     go tcs rep_ty 
191         = case splitTyConApp_maybe rep_ty of
192             Just (tc, tys)
193                 | tc `elem` tcs -> unitTy       -- Recursive loop
194                 | isNewTyCon tc -> 
195                     if isRecursiveTyCon tc then
196                         go (tc:tcs) (substTyWith tvs tys rhs_ty)
197                     else
198                         substTyWith tvs tys rhs_ty
199                 where
200                   (tvs, rhs_ty) = newTyConRhs tc
201
202             other -> rep_ty 
203
204 ------------------------------------------------------
205 buildDataCon :: Name -> Bool
206             -> [StrictnessMark] 
207             -> [Name]                   -- Field labels
208             -> [TyVar] -> [TyVar]       -- Univ and ext 
209             -> [(TyVar,Type)]           -- Equality spec
210             -> ThetaType                -- Does not include the "stupid theta"
211                                         -- or the GADT equalities
212             -> [Type] -> TyCon
213             -> TcRnIf m n DataCon
214 -- A wrapper for DataCon.mkDataCon that
215 --   a) makes the worker Id
216 --   b) makes the wrapper Id if necessary, including
217 --      allocating its unique (hence monadic)
218 buildDataCon src_name declared_infix arg_stricts field_lbls
219              univ_tvs ex_tvs eq_spec ctxt arg_tys tycon
220   = do  { wrap_name <- newImplicitBinder src_name mkDataConWrapperOcc
221         ; work_name <- newImplicitBinder src_name mkDataConWorkerOcc
222         -- This last one takes the name of the data constructor in the source
223         -- code, which (for Haskell source anyway) will be in the DataName name
224         -- space, and puts it into the VarName name space
225
226         ; let
227                 stupid_ctxt = mkDataConStupidTheta tycon arg_tys univ_tvs
228                 data_con = mkDataCon src_name declared_infix
229                                      arg_stricts field_lbls
230                                      univ_tvs ex_tvs eq_spec ctxt
231                                      arg_tys tycon
232                                      stupid_ctxt dc_ids
233                 dc_ids = mkDataConIds wrap_name work_name data_con
234
235         ; returnM data_con }
236
237
238 -- The stupid context for a data constructor should be limited to
239 -- the type variables mentioned in the arg_tys
240 -- ToDo: Or functionally dependent on?  
241 --       This whole stupid theta thing is, well, stupid.
242 mkDataConStupidTheta tycon arg_tys univ_tvs
243   | null stupid_theta = []      -- The common case
244   | otherwise         = filter in_arg_tys stupid_theta
245   where
246     tc_subst     = zipTopTvSubst (tyConTyVars tycon) (mkTyVarTys univ_tvs)
247     stupid_theta = substTheta tc_subst (tyConStupidTheta tycon)
248         -- Start by instantiating the master copy of the 
249         -- stupid theta, taken from the TyCon
250
251     arg_tyvars      = tyVarsOfTypes arg_tys
252     in_arg_tys pred = not $ isEmptyVarSet $ 
253                       tyVarsOfPred pred `intersectVarSet` arg_tyvars
254
255 ------------------------------------------------------
256 mkTyConSelIds :: TyCon -> AlgTyConRhs -> [Id]
257 mkTyConSelIds tycon rhs
258   =  [ mkRecordSelId tycon fld 
259      | fld <- nub (concatMap dataConFieldLabels (visibleDataCons rhs)) ]
260         -- We'll check later that fields with the same name 
261         -- from different constructors have the same type.
262 \end{code}
263
264
265 ------------------------------------------------------
266 \begin{code}
267 buildClass :: Name -> [TyVar] -> ThetaType
268            -> [FunDep TyVar]            -- Functional dependencies
269            -> [TyThing]                 -- Associated types
270            -> [(Name, DefMeth, Type)]   -- Method info
271            -> RecFlag                   -- Info for type constructor
272            -> TcRnIf m n Class
273
274 buildClass class_name tvs sc_theta fds ats sig_stuff tc_isrec
275   = do  { tycon_name <- newImplicitBinder class_name mkClassTyConOcc
276         ; datacon_name <- newImplicitBinder class_name mkClassDataConOcc
277                 -- The class name is the 'parent' for this datacon, not its tycon,
278                 -- because one should import the class to get the binding for 
279                 -- the datacon
280         ; sc_sel_names <- mapM (newImplicitBinder class_name . mkSuperDictSelOcc) 
281                                 [1..length sc_theta]
282               -- We number off the superclass selectors, 1, 2, 3 etc so that we 
283               -- can construct names for the selectors.  Thus
284               --      class (C a, C b) => D a b where ...
285               -- gives superclass selectors
286               --      D_sc1, D_sc2
287               -- (We used to call them D_C, but now we can have two different
288               --  superclasses both called C!)
289
290         ; fixM (\ rec_clas -> do {      -- Only name generation inside loop
291
292           let { rec_tycon          = classTyCon rec_clas
293               ; op_tys             = [ty | (_,_,ty) <- sig_stuff]
294               ; sc_tys             = mkPredTys sc_theta
295               ; dict_component_tys = sc_tys ++ op_tys
296               ; sc_sel_ids         = [mkDictSelId sc_name rec_clas | sc_name <- sc_sel_names]
297               ; op_items = [ (mkDictSelId op_name rec_clas, dm_info)
298                            | (op_name, dm_info, _) <- sig_stuff ] }
299                         -- Build the selector id and default method id
300
301         ; dict_con <- buildDataCon datacon_name
302                                    False        -- Not declared infix
303                                    (map (const NotMarkedStrict) dict_component_tys)
304                                    [{- No labelled fields -}]
305                                    tvs [{- no existentials -}]
306                                    [{- No equalities -}] [{-No context-}] 
307                                    dict_component_tys 
308                                    rec_tycon
309
310         ; rhs <- case dict_component_tys of
311                             [rep_ty] -> mkNewTyConRhs tycon_name rec_tycon dict_con
312                             other    -> return (mkDataTyConRhs [dict_con])
313
314         ; let { clas_kind = mkArrowKinds (map tyVarKind tvs) liftedTypeKind
315
316               ; tycon = mkClassTyCon tycon_name clas_kind tvs
317                                      rhs rec_clas tc_isrec
318                 -- A class can be recursive, and in the case of newtypes 
319                 -- this matters.  For example
320                 --      class C a where { op :: C b => a -> b -> Int }
321                 -- Because C has only one operation, it is represented by
322                 -- a newtype, and it should be a *recursive* newtype.
323                 -- [If we don't make it a recursive newtype, we'll expand the
324                 -- newtype like a synonym, but that will lead to an infinite
325                 -- type]
326               ; atTyCons = [tycon | ATyCon tycon <- ats]
327               }
328         ; return (mkClass class_name tvs fds 
329                        sc_theta sc_sel_ids atTyCons op_items
330                        tycon)
331         })}
332 \end{code}
333
334