tcSetDefaultTys defaultDefaultTys $
-- Typecheck the extra declarations
- fixTc (\ ~(unf_env, _, _, _, _) ->
- tcImports unf_env pcs hst get_fixity this_mod iface_decls
- ) `thenTc` \ (env, new_pcs, local_inst_info, deriv_binds, local_rules) ->
- ASSERT( null local_inst_info && nullBinds deriv_binds && null local_rules )
+ tcExtraDecls pcs hst get_fixity this_mod iface_decls `thenTc` \ (new_pcs, env) ->
tcSetEnv env $
tcExtendGlobalTypeEnv ic_type_env $
tcSetDefaultTys defaultDefaultTys $
-- Typecheck the extra declarations
- fixTc (\ ~(unf_env, _, _, _, _) ->
- tcImports unf_env pcs hst get_fixity this_mod decls
- ) `thenTc` \ (env, new_pcs, local_inst_info, deriv_binds, local_rules) ->
- ASSERT( null local_inst_info && nullBinds deriv_binds && null local_rules )
+ tcExtraDecls pcs hst get_fixity this_mod decls `thenTc` \ (new_pcs, env) ->
-- Now typecheck the expression
tcSetEnv env $
typecheckExtraDecls dflags pcs hst unqual this_mod decls
= typecheck dflags pcs hst unqual $
- fixTc (\ ~(unf_env, _, _, _, _) ->
- tcImports unf_env pcs hst get_fixity this_mod decls
- ) `thenTc` \ (env, new_pcs, local_inst_info, deriv_binds, local_rules) ->
- ASSERT( null local_inst_info && nullBinds deriv_binds && null local_rules )
+ tcExtraDecls pcs hst get_fixity this_mod decls
+ `thenTc` \ (new_pcs, env) ->
returnTc new_pcs
where
get_fixity n = pprPanic "typecheckExpr" (ppr n)
+
+tcExtraDecls pcs hst get_fixity this_mod decls =
+ fixTc (\ ~(unf_env, _, _, _, _, _) ->
+ tcImports unf_env pcs hst get_fixity this_mod decls
+ ) `thenTc` \ (env, new_pcs, local_inst_info, local_inst_dfuns,
+ deriv_binds, local_rules) ->
+ ASSERT( null local_inst_info && nullBinds deriv_binds && null local_rules
+ && null local_inst_dfuns )
+ returnTc (new_pcs, env)
\end{code}
%************************************************************************
-- Type-check the type and class decls, and all imported decls
tcImports unf_env pcs hst get_fixity this_mod decls
- `thenTc` \ (env, new_pcs, local_insts, deriv_binds, local_rules) ->
+ `thenTc` \ (env, new_pcs, local_inst_info, local_inst_dfuns, deriv_binds, local_rules) ->
tcSetEnv env $
tcSetEnv env $
tcClassDecls2 this_mod tycl_decls `thenNF_Tc` \ (lie_clasdecls, cls_dm_binds, dm_ids) ->
tcExtendGlobalValEnv dm_ids $
- tcInstDecls2 local_insts `thenNF_Tc` \ (lie_instdecls, inst_binds) ->
+ tcInstDecls2 local_inst_info `thenNF_Tc` \ (lie_instdecls, inst_binds) ->
tcForeignExports decls `thenTc` \ (lie_fodecls, foe_binds, foe_decls) ->
tcSourceRules source_rules `thenNF_Tc` \ (lie_rules, more_local_rules) ->
returnTc (final_env,
new_pcs,
TcResults { tc_env = local_type_env,
- tc_insts = map iDFunId local_insts,
+ tc_insts = local_inst_dfuns,
tc_binds = all_binds',
tc_fords = foi_decls ++ foe_decls',
tc_rules = all_local_rules
get_fixity nm = lookupNameEnv fixity_env nm
tcIfaceImports pcs hst get_fixity this_mod decls
- = fixTc (\ ~(unf_env, _, _, _, _) ->
+ = fixTc (\ ~(unf_env, _, _, _, _, _) ->
tcImports unf_env pcs hst get_fixity this_mod decls
- ) `thenTc` \ (env, new_pcs, local_inst_info,
+ ) `thenTc` \ (env, new_pcs, local_inst_info, local_inst_dfuns,
deriv_binds, local_rules) ->
- ASSERT(nullBinds deriv_binds)
+ ASSERT(nullBinds deriv_binds && null local_inst_info)
let
local_things = filter (isLocalThing this_mod) (typeEnvElts (getTcGEnv env))
mod_details = ModDetails { md_types = mkTypeEnv local_things,
- md_insts = map iDFunId local_inst_info,
+ md_insts = local_inst_dfuns,
md_rules = [(id,rule) | IfaceRuleOut id rule <- local_rules],
md_binds = [] }
-- All the rules from an interface are of the IfaceRuleOut form
-> (Name -> Maybe Fixity)
-> Module
-> [RenamedHsDecl]
- -> TcM (TcEnv, PersistentCompilerState, [InstInfo],
+ -> TcM (TcEnv, PersistentCompilerState, [InstInfo], [DFunId],
RenamedHsBinds, [TypecheckedRuleDecl])
-- tcImports is a slight mis-nomer.
-- Note that imported dictionary functions are already
-- in scope from the preceding tcInterfaceSigs
traceTc (text "Tc3") `thenNF_Tc_`
- tcInstDecls1 (pcs_insts pcs) (pcs_PRS pcs)
- hst unf_env get_fixity this_mod
- decls `thenTc` \ (new_pcs_insts, inst_env, local_insts, deriv_binds) ->
+ tcInstDecls1 (pcs_insts pcs) (pcs_PRS pcs) hst unf_env get_fixity this_mod decls
+ `thenTc` \ (new_pcs_insts, inst_env, local_inst_info, local_inst_dfuns, deriv_binds) ->
tcSetInstEnv inst_env $
tcIfaceRules unf_env (pcs_rules pcs) this_mod iface_rules `thenNF_Tc` \ (new_pcs_rules, local_rules) ->
pcs_rules = new_pcs_rules
}
in
- returnTc (unf_env, new_pcs, local_insts, deriv_binds, local_rules)
+ returnTc (unf_env, new_pcs, local_inst_info, local_inst_dfuns, deriv_binds, local_rules)
where
tycl_decls = [d | TyClD d <- decls]
iface_rules = [d | RuleD d <- decls, isIfaceRuleDecl d]