2 % (c) The AQUA Project, Glasgow University, 1996
4 \section[TcTyDecls]{Typecheck type declarations}
7 #include "HsVersions.h"
17 import HsSyn ( TyDecl(..), ConDecl(..), BangType(..), HsExpr(..),
18 Match(..), GRHSsAndBinds(..), GRHS(..), OutPat(..),
19 HsBinds(..), HsLit, Stmt, Qual, ArithSeqInfo,
20 PolyType, Fake, InPat,
21 Bind(..), MonoBinds(..), Sig,
23 import RnHsSyn ( RenamedTyDecl(..), RenamedConDecl(..),
24 RnName{-instance Outputable-}
26 import TcHsSyn ( mkHsTyLam, mkHsDictLam, tcIdType, zonkId,
27 TcHsBinds(..), TcIdOcc(..)
29 import Inst ( newDicts, InstOrigin(..), Inst )
30 import TcMonoType ( tcMonoTypeKind, tcMonoType, tcContext )
31 import TcType ( tcInstTyVars, tcInstType, tcInstId )
32 import TcEnv ( tcLookupTyCon, tcLookupTyVar, tcLookupClass,
34 newLocalId, newLocalIds
37 import TcKind ( TcKind, unifyKind, mkTcArrowKind, mkTcTypeKind )
39 import Class ( GenClass{-instance Eq-} )
40 import Id ( mkDataCon, dataConSig, mkRecordSelId,
41 dataConFieldLabels, dataConStrictMarks,
43 GenId{-instance NamedThing-}
46 import Kind ( Kind, mkArrowKind, mkBoxedTypeKind )
47 import SpecEnv ( SpecEnv(..), nullSpecEnv )
48 import Name ( nameSrcLoc, isLocallyDefinedName, getSrcLoc,
52 import TyCon ( TyCon, NewOrData(..), mkSynTyCon, mkDataTyCon, isDataTyCon,
54 import Type ( getTypeKind, getTyVar, tyVarsOfTypes, eqTy,
55 applyTyCon, mkTyVarTys, mkForAllTys, mkFunTy,
56 splitFunTy, mkTyVarTy, getTyVar_maybe
58 import TyVar ( getTyVarKind, elementOfTyVarSet, GenTyVar{-instance Eq-} )
59 import Unique ( Unique {- instance Eq -}, dataClassKey )
60 import UniqSet ( emptyUniqSet, mkUniqSet, uniqSetToList, unionManyUniqSets, UniqSet(..) )
61 import Util ( equivClasses, zipEqual, panic, assertPanic )
65 tcTyDecl :: RenamedTyDecl -> TcM s TyCon
72 tcTyDecl (TySynonym tycon_name tyvar_names rhs src_loc)
73 = tcAddSrcLoc src_loc $
74 tcAddErrCtxt (tySynCtxt tycon_name) $
77 tcLookupTyCon tycon_name `thenNF_Tc` \ (tycon_kind, _, rec_tycon) ->
78 mapAndUnzipNF_Tc tcLookupTyVar tyvar_names `thenNF_Tc` \ (tyvar_kinds, rec_tyvars) ->
81 tcMonoTypeKind rhs `thenTc` \ (rhs_kind, rhs_ty) ->
83 -- Unify tycon kind with (k1->...->kn->rhs)
85 (foldr mkTcArrowKind rhs_kind tyvar_kinds)
88 -- Getting the TyCon's kind is a bit of a nuisance. We can't use the tycon_kind,
89 -- because that's a TcKind and may not yet be fully unified with other kinds.
90 -- We could have augmented the tycon environment with a knot-tied kind,
91 -- but the simplest thing to do seems to be to get the Kind by (lazily)
92 -- looking at the tyvars and rhs_ty.
93 result_kind, final_tycon_kind :: Kind -- NB not TcKind!
94 result_kind = getTypeKind rhs_ty
95 final_tycon_kind = foldr (mkArrowKind . getTyVarKind) result_kind rec_tyvars
97 -- Construct the tycon
98 tycon = mkSynTyCon (getName tycon_name)
107 Algebraic data and newtype decls
108 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
111 tcTyDecl (TyData context tycon_name tyvar_names con_decls derivings pragmas src_loc)
112 = tcTyDataOrNew DataType context tycon_name tyvar_names con_decls derivings pragmas src_loc
114 tcTyDecl (TyNew context tycon_name tyvar_names con_decl derivings pragmas src_loc)
115 = tcTyDataOrNew NewType context tycon_name tyvar_names con_decl derivings pragmas src_loc
118 tcTyDataOrNew data_or_new context tycon_name tyvar_names con_decls derivings pragmas src_loc
119 = tcAddSrcLoc src_loc $
120 tcAddErrCtxt (tyDataCtxt tycon_name) $
123 tcLookupTyCon tycon_name `thenNF_Tc` \ (tycon_kind, _, rec_tycon) ->
124 mapAndUnzipNF_Tc tcLookupTyVar tyvar_names `thenNF_Tc` \ (tyvar_kinds, rec_tyvars) ->
125 tc_derivs derivings `thenNF_Tc` \ derived_classes ->
127 -- Typecheck the context
128 tcContext context `thenTc` \ ctxt ->
130 -- Unify tycon kind with (k1->...->kn->Type)
132 (foldr mkTcArrowKind mkTcTypeKind tyvar_kinds)
136 mapTc (tcConDecl rec_tycon rec_tyvars ctxt) con_decls
137 `thenTc` \ con_ids ->
139 -- Construct the tycon
140 final_tycon_kind :: Kind -- NB not TcKind!
141 final_tycon_kind = foldr (mkArrowKind . getTyVarKind) mkBoxedTypeKind rec_tyvars
143 tycon = mkDataTyCon (getName tycon_name)
153 tc_derivs Nothing = returnNF_Tc []
154 tc_derivs (Just ds) = mapNF_Tc tc_deriv ds
157 = tcLookupClass name `thenNF_Tc` \ (_, clas) ->
161 Generating constructor/selector bindings for data declarations
162 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
165 mkDataBinds :: TyCon -> TcM s ([Id], TcHsBinds s)
167 = ASSERT( isDataTyCon tycon )
168 mapAndUnzipTc mkConstructor data_cons `thenTc` \ (con_ids, con_binds) ->
169 mapAndUnzipTc (mkRecordSelector tycon) groups `thenTc` \ (sel_ids, sel_binds) ->
170 returnTc (con_ids ++ sel_ids,
171 SingleBind $ NonRecBind $
173 (foldr AndMonoBinds EmptyMonoBinds con_binds)
177 data_cons = tyConDataCons tycon
178 fields = [ (con, field) | con <- data_cons,
179 field <- dataConFieldLabels con
182 -- groups is list of fields that share a common name
183 groups = equivClasses cmp_name fields
184 cmp_name (_, field1) (_, field2)
185 = fieldLabelName field1 `cmp` fieldLabelName field2
188 We're going to build a constructor that looks like:
190 data (Data a, C b) => T a b = T1 !a !Int b
193 \d1::Data a, d2::C b ->
194 \p q r -> case p of { p ->
196 HsCon [a,b,c] [p,q,r]}}
200 * d2 is thrown away --- a context in a data decl is used to make sure
201 one *could* construct dictionaries at the site the constructor
202 is used, but the dictionary isn't actually used.
204 * We have to check that we can construct Data dictionaries for
205 the types a and Int. Once we've done that we can throw d1 away too.
207 * We use (case p of ...) to evaluate p, rather than "seq" because
208 all that matters is that the arguments are evaluated. "seq" is
209 very careful to preserve evaluation order, which we don't need
214 | not (isLocallyDefinedName (getName con_id))
215 = returnTc (con_id, EmptyMonoBinds)
217 | otherwise -- It is locally defined
218 = tcInstId con_id `thenNF_Tc` \ (tyvars, theta, tau) ->
219 newDicts DataDeclOrigin theta `thenNF_Tc` \ (_, dicts) ->
221 (arg_tys, result_ty) = splitFunTy tau
222 n_args = length arg_tys
224 newLocalIds (take n_args (repeat SLIT("con"))) arg_tys `thenNF_Tc` {- \ pre_zonk_args ->
225 mapNF_Tc zonkId pre_zonk_args `thenNF_Tc` -} \ args ->
227 -- Check that all the types of all the strict
228 -- arguments are in Data. This is trivially true of everything except
229 -- type variables, for which we must check the context.
231 strict_marks = dataConStrictMarks con_id
232 strict_args = [arg | (arg, MarkedStrict) <- args `zipEqual` strict_marks]
234 data_tyvars = -- The tyvars in the constructor's context that are arguments
236 [getTyVar "mkConstructor" ty
237 | (clas,ty) <- theta,
238 uniqueOf clas == dataClassKey]
240 check_data arg = case getTyVar_maybe (tcIdType arg) of
241 Nothing -> returnTc () -- Not a tyvar, so OK
242 Just tyvar -> checkTc (tyvar `elem` data_tyvars) (missingDataErr tyvar)
244 mapTc check_data strict_args `thenTc_`
246 -- Build the data constructor
248 con_rhs = mkHsTyLam tyvars $
251 mk_case strict_args $
252 HsCon con_id arg_tys (map HsVar args)
254 mk_pat_match [] body = body
255 mk_pat_match (arg:args) body = HsLam (PatMatch (VarPat arg) (SimpleMatch (mk_pat_match args body)))
257 mk_case [] body = body
258 mk_case (arg:args) body = HsCase (HsVar arg)
259 [PatMatch (VarPat arg) (SimpleMatch (mk_case args body))]
262 src_loc = nameSrcLoc (getName con_id)
265 returnTc (con_id, VarMonoBind (RealId con_id) con_rhs)
268 We're going to build a record selector that looks like this:
270 data T a b c = T1 { op :: a, ...}
274 sel :: forall a b c. T a b c -> a
275 sel = /\ a b c -> \ T1 { sel = x } -> x
278 Note that the selector Id itself is used as the field
279 label; it has to be an Id, you see!
282 mkRecordSelector tycon fields@((first_con, first_field_label) : other_fields)
284 field_ty = fieldLabelType first_field_label
285 field_name = fieldLabelName first_field_label
286 other_tys = [fieldLabelType fl | (_, fl) <- other_fields]
287 (tyvars, _, _, _) = dataConSig first_con
288 data_ty = applyTyCon tycon (mkTyVarTys tyvars)
289 -- tyvars of first_con may be free in field_ty
292 -- Check that all the fields in the group have the same type
293 -- This check assumes that all the constructors of a given
294 -- data type use the same type variables
295 checkTc (all (eqTy field_ty) other_tys)
296 (fieldTypeMisMatch field_name) `thenTc_`
298 -- Create an Id for the field itself
299 tcInstTyVars tyvars `thenNF_Tc` \ (tyvars', tyvar_tys, tenv) ->
300 tcInstType tenv field_ty `thenNF_Tc` \ field_ty' ->
302 data_ty' = applyTyCon tycon tyvar_tys
304 newLocalId SLIT("x") field_ty' `thenNF_Tc` \ field_id ->
305 newLocalId SLIT("r") data_ty' `thenNF_Tc` \ record_id ->
307 -- Now build the selector
310 selector_ty = mkForAllTys tyvars $
315 selector_id = mkRecordSelId first_field_label selector_ty
317 -- HsSyn is dreadfully verbose for defining the selector!
318 selector_rhs = mkHsTyLam tyvars' $
320 PatMatch (VarPat record_id) $
324 selector_body = HsCase (HsVar record_id) (map mk_match fields) (getSrcLoc tycon)
326 mk_match (con_id, field_label)
327 = PatMatch (RecPat con_id data_ty' [(RealId selector_id, VarPat field_id, False)]) $
331 returnTc (selector_id, if isLocallyDefinedName (getName tycon)
332 then VarMonoBind (RealId selector_id) selector_rhs
339 tcConDecl :: TyCon -> [TyVar] -> [(Class,Type)] -> RenamedConDecl -> TcM s Id
341 tcConDecl tycon tyvars ctxt (ConDecl name btys src_loc)
342 = tcDataCon tycon tyvars ctxt name btys src_loc
344 tcConDecl tycon tyvars ctxt (ConOpDecl bty1 op bty2 src_loc)
345 = tcDataCon tycon tyvars ctxt op [bty1,bty2] src_loc
347 tcConDecl tycon tyvars ctxt (NewConDecl name ty src_loc)
348 = tcAddSrcLoc src_loc $
349 tcMonoType ty `thenTc` \ arg_ty ->
351 data_con = mkDataCon (getName name)
353 [{- No labelled fields -}]
362 tcConDecl tycon tyvars ctxt (RecConDecl name fields src_loc)
363 = tcAddSrcLoc src_loc $
364 mapTc tcField fields `thenTc` \ field_label_infos_s ->
366 field_label_infos = concat field_label_infos_s
367 stricts = [strict | (_, _, strict) <- field_label_infos]
368 arg_tys = [ty | (_, ty, _) <- field_label_infos]
370 field_labels = [ mkFieldLabel (getName name) ty tag
371 | ((name, ty, _), tag) <- field_label_infos `zip` allFieldLabelTags
374 data_con = mkDataCon (getName name)
378 (thinContext arg_tys ctxt)
385 tcField (field_label_names, bty)
386 = tcMonoType (get_ty bty) `thenTc` \ field_ty ->
387 returnTc [(name, field_ty, get_strictness bty) | name <- field_label_names]
389 tcDataCon tycon tyvars ctxt name btys src_loc
390 = tcAddSrcLoc src_loc $
392 stricts = map get_strictness btys
393 tys = map get_ty btys
395 mapTc tcMonoType tys `thenTc` \ arg_tys ->
397 data_con = mkDataCon (getName name)
399 [{- No field labels -}]
401 (thinContext arg_tys ctxt)
408 -- The context for a data constructor should be limited to
409 -- the type variables mentioned in the arg_tys
410 thinContext arg_tys ctxt
411 = filter in_arg_tys ctxt
413 arg_tyvars = tyVarsOfTypes arg_tys
414 in_arg_tys (clas,ty) = getTyVar "tcDataCon" ty `elementOfTyVarSet` arg_tyvars
416 get_strictness (Banged ty) = MarkedStrict
417 get_strictness (Unbanged ty) = NotMarkedStrict
419 get_ty (Banged ty) = ty
420 get_ty (Unbanged ty) = ty
428 tySynCtxt tycon_name sty
429 = ppCat [ppStr "In the type declaration for", ppr sty tycon_name]
431 tyDataCtxt tycon_name sty
432 = ppCat [ppStr "In the data declaration for", ppr sty tycon_name]
434 tyNewCtxt tycon_name sty
435 = ppCat [ppStr "In the newtype declaration for", ppr sty tycon_name]
437 fieldTypeMisMatch field_name sty
438 = ppSep [ppStr "Declared types differ for field", ppr sty field_name]
440 missingDataErr tyvar sty
441 = ppStr "Missing `data' (???)" -- ToDo: improve