-\begin{code}
-tcClassDecl1 rec_inst_mapper
- (ClassDecl context class_name
- tyvar_name class_sigs def_methods pragmas src_loc)
- = tcAddSrcLoc src_loc $
- tcAddErrCtxt (classDeclCtxt class_name) $
-
- -- LOOK THINGS UP IN THE ENVIRONMENT
- tcLookupClass class_name `thenTc` \ (class_kind, rec_class) ->
- tcLookupTyVar (getTyVarName tyvar_name) `thenNF_Tc` \ (tyvar_kind, rec_tyvar) ->
- let
- (rec_class_inst_env, rec_class_op_inst_fn) = rec_inst_mapper rec_class
- in
-
- -- FORCE THE CLASS AND ITS TYVAR TO HAVE SAME KIND
- unifyKind class_kind tyvar_kind `thenTc_`
-
- -- CHECK THE CONTEXT
- tcClassContext rec_class rec_tyvar context pragmas
- `thenTc` \ (scs, sc_sel_ids) ->
-
- -- CHECK THE CLASS SIGNATURES,
- mapTc (tcClassSig rec_class rec_tyvar rec_class_op_inst_fn) class_sigs
- `thenTc` \ sig_stuff ->
-
- -- MAKE THE CLASS OBJECT ITSELF
- let
- (ops, op_sel_ids, defm_ids) = unzip3 sig_stuff
- clas = mkClass (uniqueOf class_name) (getName class_name) rec_tyvar
- scs sc_sel_ids ops op_sel_ids defm_ids
- rec_class_inst_env
- in
- returnTc clas
-\end{code}
-
-
- let
- clas_ty = mkTyVarTy clas_tyvar
- dict_component_tys = [mkDictTy sc clas_ty | sc <- scs] ++
- [classOpLocalType op | op <- ops])
- new_or_data = case dict_component_tys of
- [_] -> NewType
- other -> DataType
-
- dict_con_id = mkDataCon class_name
- [NotMarkedStrict]
- [{- No labelled fields -}]
- [clas_tyvar]
- [{-No context-}]
- dict_component_tys
- tycon
-
- tycon = mkDataTyCon class_name
- (tyVarKind rec_tyvar `mkArrowKind` mkBoxedTypeKind)
- [rec_tyvar]
- [{- Empty context -}]
- [dict_con_id]
- [{- No derived classes -}]
- new_or_data
- in
-
-
-\begin{code}
-tcClassContext :: Class -> TyVar
- -> RenamedContext -- class context
- -> RenamedClassPragmas -- pragmas for superclasses
- -> TcM s ([Class], -- the superclasses
- [Id]) -- superclass selector Ids
-
-tcClassContext rec_class rec_tyvar context pragmas
- = -- Check the context.
- -- The renamer has already checked that the context mentions
- -- only the type variable of the class decl.
- tcContext context `thenTc` \ theta ->
- let
- super_classes = [ supers | (supers, _) <- theta ]
- in
-
- -- Make super-class selector ids
- mapTc (mk_super_id rec_class) super_classes `thenTc` \ sc_sel_ids ->
-
- -- Done
- returnTc (super_classes, sc_sel_ids)
-
- where
- rec_tyvar_ty = mkTyVarTy rec_tyvar
-
- mk_super_id rec_class super_class
- = tcGetUnique `thenNF_Tc` \ uniq ->
- let
- ty = mkForAllTy rec_tyvar $
- mkFunTy (mkDictTy rec_class rec_tyvar_ty)
- (mkDictTy super_class rec_tyvar_ty)
- in
- returnTc (mkSuperDictSelId uniq rec_class super_class ty)
-
-
-tcClassSig :: Class -- Knot tying only!
- -> TyVar -- The class type variable, used for error check only
- -> (ClassOp -> SpecEnv) -- Ditto; the spec info for the class ops
- -> RenamedClassOpSig
- -> TcM s (ClassOp, -- class op
- Id, -- selector id
- Id) -- default-method ids
-
-tcClassSig rec_clas rec_clas_tyvar rec_classop_spec_fn
- (ClassOpSig op_name dm_name
- op_ty
- src_loc)
- = tcAddSrcLoc src_loc $
- fixTc ( \ ~(_, rec_sel_id, rec_defm_id) -> -- Knot for pragmas
-
- -- Check the type signature. NB that the envt *already has*
- -- bindings for the type variables; see comments in TcTyAndClassDcls.
-
- -- NB: Renamer checks that the class type variable is mentioned in local_ty,
- -- and that it is not constrained by theta
- tcHsType op_ty `thenTc` \ local_ty ->
- let
- global_ty = mkSigmaTy [rec_clas_tyvar]
- [(rec_clas, mkTyVarTy rec_clas_tyvar)]
- local_ty
- class_op_nm = getOccName op_name
- class_op = mkClassOp class_op_nm
- (classOpTagByOccName rec_clas{-yeeps!-} class_op_nm)
- local_ty
- in
-
- -- Build the selector id and default method id
- let
- sel_id = mkMethodSelId op_name rec_clas class_op global_ty
- defm_id = mkDefaultMethodId dm_name rec_clas class_op False global_ty
- -- ToDo: improve the "False"
- in
- tcAddImportedIdInfo defm_id `thenNF_Tc` \ final_defm_id ->
- returnTc (class_op, sel_id, final_defm_id)
- )
-\end{code}
-
-