-tcInstDecls1 :: TcEnv s -- Contains IdInfo for dfun ids
- -> [RenamedHsDecl]
- -> Module -- module name for deriving
- -> RnNameSupply -- for renaming derivings
- -> TcM s (Bag InstInfo,
- RenamedHsBinds,
- SDoc)
-
-tcInstDecls1 unf_env decls mod_name rn_name_supply
- = -- Do the ordinary instance declarations
- mapNF_Tc (tcInstDecl1 unf_env mod_name)
- [inst_decl | InstD inst_decl <- decls] `thenNF_Tc` \ inst_info_bags ->
+tcInstDecls1
+ :: PackageInstEnv
+ -> PersistentRenamerState
+ -> HomeSymbolTable -- Contains instances
+ -> TcEnv -- Contains IdInfo for dfun ids
+ -> (Name -> Maybe Fixity) -- for deriving Show and Read
+ -> Module -- Module for deriving
+ -> [RenamedHsDecl]
+ -> TcM (PackageInstEnv, -- cached package inst env
+ InstEnv, -- the full inst env
+ [InstInfo], -- instance decls to process
+ [DFunId], -- instances from this module, for its iface
+ RenamedHsBinds) -- derived instances
+
+tcInstDecls1 inst_env0 prs hst unf_env get_fixity this_mod decls
+ = let
+ inst_decls = [inst_decl | InstD inst_decl <- decls]
+ tycl_decls = [decl | TyClD decl <- decls]
+ clas_decls = filter isClassDecl tycl_decls
+ (iface_inst_ds, local_inst_ds) = partition isIfaceInstDecl inst_decls
+ in
+ -- (1) Do the ordinary instance declarations
+ mapNF_Tc tcLocalInstDecl1 local_inst_ds `thenNF_Tc` \ local_inst_infos ->
+ mapNF_Tc tcImportedInstDecl1 iface_inst_ds `thenNF_Tc` \ iface_dfuns ->
+
+ -- (2) Instances from generic class declarations
+ getGenericInstances clas_decls `thenTc` \ generic_inst_info ->
+
+ -- Next, construct the instance environment so far, consisting of
+ -- a) cached non-home-package InstEnv (gotten from pcs) inst_env0
+ -- b) imported instance decls (not in the home package) inst_env1
+ -- c) other modules in this package (gotten from hst) inst_env2
+ -- d) imported instance decls (from this module) inst_env3
+ -- e) local instance decls inst_env4
+ -- f) generic instances inst_env5
+ -- The result of (b) replaces the cached InstEnv in the PCS
+ --
+ -- Note that iface_dfuns may contain not only insts that we
+ -- demand-loaded from interface files, but also instances from
+ -- the current module in the case where we are loading this
+ -- module's interface file in GHCi, so we partition the
+ -- iface_dfuns into non-local and local instances so that we
+ -- don't end up with home package instances in the PCS.
+ --
+ -- There can't be any instance declarations from the home
+ -- package other than from the current module (with the
+ -- compilation manager) because they are loaded explicitly by
+ -- the compilation manager.