- tcInstDecls2 inst_info `thenNF_Tc` \ (lie_instdecls, inst_binds) ->
- tcClassDecls2 cls_decls_bag `thenNF_Tc` \ (lie_clasdecls, cls_binds) ->
- tcGetEnv `thenNF_Tc` \ env ->
- returnTc ( (EmptyBinds, (inst_binds, cls_binds, env)),
- lie_instdecls `plusLIE` lie_clasdecls,
- () ))
-
- `thenTc` \ ((val_binds, (inst_binds, cls_binds, final_env)), lie_alldecls, _) ->
-
- checkTopLevelIds mod_name final_env `thenTc_`
-
- -- Deal with constant or ambiguous InstIds. How could
- -- there be ambiguous ones? They can only arise if a
- -- top-level decl falls under the monomorphism
- -- restriction, and no subsequent decl instantiates its
- -- type. (Usually, ambiguous type variables are resolved
- -- during the generalisation step.)
- tcSimplifyTop lie_alldecls `thenTc` \ const_insts ->
-
- -- Backsubstitution. Monomorphic top-level decls may have
- -- been instantiated by subsequent decls, and the final
- -- simplification step may have instantiated some
- -- ambiguous types. So, sadly, we need to back-substitute
- -- over the whole bunch of bindings.
- --
- -- More horrible still, we have to do it in a careful order, so that
- -- all the TcIds are in scope when we come across them.
- --
- -- These bindings ought really to be bundled together in a huge
- -- recursive group, but HsSyn doesn't have recursion among Binds, only
- -- among MonoBinds. Sigh again.
- zonkDictBinds nullTyVarEnv nullIdEnv const_insts `thenNF_Tc` \ (const_insts', ve1) ->
- zonkBinds nullTyVarEnv ve1 val_binds `thenNF_Tc` \ (val_binds', ve2) ->
-
- zonkBinds nullTyVarEnv ve2 data_binds `thenNF_Tc` \ (data_binds', _) ->
- zonkBinds nullTyVarEnv ve2 inst_binds `thenNF_Tc` \ (inst_binds', _) ->
- zonkBinds nullTyVarEnv ve2 cls_binds `thenNF_Tc` \ (cls_binds', _) ->
-
- let
- localids = getEnv_LocalIds final_env
- tycons = getEnv_TyCons final_env
- classes = getEnv_Classes final_env
-
- local_tycons = filter isLocallyDefined tycons
- local_classes = filter isLocallyDefined classes
- local_vals = [ v | v <- eltsUFM ve2, isLocallyDefined v && isTopLevId v ]
- -- the isTopLevId is doubtful...
- in
- -- FINISHED AT LAST
- returnTc (
- (data_binds', cls_binds', inst_binds', val_binds', const_insts'),
-
- -- the next collection is just for mkInterface
- (local_vals, local_tycons, local_classes, inst_info),
-
- tycon_specs,
-
- ddump_deriv
- )))
- where
- ty_decls_bag = listToBag ty_decls
- cls_decls_bag = listToBag cls_decls
- inst_decls_bag = listToBag inst_decls
-\end{code}