X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=ghc%2Fcompiler%2Ftypecheck%2FTcInstDcls.lhs;h=21ed1d5cbc3c29fbaa09775ff79c88f23df11436;hb=b27560c4649d7025456fb9936d5a5cdd1e5dc383;hp=bf79e5cc348250bb1a90fa21a55477e6dae96047;hpb=f3695b15d9849df7b808e17aa600511ad6002a31;p=ghc-hetmet.git diff --git a/ghc/compiler/typecheck/TcInstDcls.lhs b/ghc/compiler/typecheck/TcInstDcls.lhs index bf79e5c..21ed1d5 100644 --- a/ghc/compiler/typecheck/TcInstDcls.lhs +++ b/ghc/compiler/typecheck/TcInstDcls.lhs @@ -4,7 +4,8 @@ \section[TcInstDecls]{Typechecking instance declarations} \begin{code} -module TcInstDcls ( tcInstDecls1, tcInstDecls2, tcAddDeclCtxt ) where +module TcInstDcls ( tcInstDecls1, tcIfaceInstDecls1, addInstDFuns, + tcInstDecls2, initInstEnv, tcAddDeclCtxt ) where #include "HsVersions.h" @@ -14,7 +15,7 @@ import CmdLineOpts ( DynFlag(..) ) import HsSyn ( HsDecl(..), InstDecl(..), TyClDecl(..), HsType(..), MonoBinds(..), HsExpr(..), HsLit(..), Sig(..), HsTyVarBndr(..), andMonoBindList, collectMonoBinders, - isClassDecl, isIfaceInstDecl, toHsType + isClassDecl, toHsType ) import RnHsSyn ( RenamedHsBinds, RenamedInstDecl, RenamedHsDecl, RenamedMonoBinds, RenamedTyClDecl, RenamedHsType, @@ -33,7 +34,7 @@ import TcType ( mkClassPred, mkTyVarTy, mkTyVarTys, tcSplitForAllTys, import Inst ( InstOrigin(..), newDicts, instToId, LIE, mkLIE, emptyLIE, plusLIE, plusLIEs ) import TcDeriv ( tcDeriving ) -import TcEnv ( TcEnv, tcExtendGlobalValEnv, +import TcEnv ( TcEnv, tcExtendGlobalValEnv, isLocalThing, tcExtendTyVarEnvForMeths, tcLookupId, tcLookupClass, InstInfo(..), pprInstInfo, simpleInstInfoTyCon, simpleInstInfoTy, newDFunName @@ -43,8 +44,9 @@ import PprType ( pprClassPred ) import TcMonoType ( tcHsTyVars, kcHsSigType, tcHsType, tcHsSigType ) import TcUnify ( checkSigTyVars ) import TcSimplify ( tcSimplifyCheck ) -import HscTypes ( HomeSymbolTable, DFunId, - ModDetails(..), PackageInstEnv, PersistentRenamerState +import HscTypes ( HomeSymbolTable, DFunId, + PersistentCompilerState(..), PersistentRenamerState, + ModDetails(..), PackageInstEnv ) import Subst ( substTy, substTheta ) import DataCon ( classDataCon ) @@ -158,62 +160,64 @@ and $dbinds_super$ bind the superclass dictionaries sd1 \ldots sdm. Gather up the instance declarations from their various sources \begin{code} -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, InstEnv, [InstInfo], RenamedHsBinds) - -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 - (imported_inst_ds, local_inst_ds) = partition isIfaceInstDecl inst_decls - in +tcInstDecls1 -- Deal with source-code instance decls + :: PersistentRenamerState + -> InstEnv -- Imported instance envt + -> (Name -> Maybe Fixity) -- for deriving Show and Read + -> Module -- Module for deriving + -> [RenamedTyClDecl] -- For deriving stuff + -> [RenamedInstDecl] -- Source code instance decls + -> TcM (InstEnv, -- the full inst env + [InstInfo], -- instance decls to process; contains all dfuns + -- for this module + RenamedHsBinds) -- derived instances + +tcInstDecls1 prs inst_env get_fixity this_mod + tycl_decls inst_decls +-- The incoming inst_env includes all the imported instances already + = checkNoErrsTc $ + -- Stop if addInstInfos etc discovers any errors + -- (they recover, so that we get more than one error each round) -- (1) Do the ordinary instance declarations - mapNF_Tc tcLocalInstDecl1 local_inst_ds `thenNF_Tc` \ local_inst_infos -> - mapNF_Tc tcImportedInstDecl1 imported_inst_ds `thenNF_Tc` \ imported_dfuns -> + mapNF_Tc tcLocalInstDecl1 inst_decls `thenNF_Tc` \ local_inst_infos -> + let + local_inst_info = catMaybes local_inst_infos + clas_decls = filter isClassDecl tycl_decls + in -- (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) pcs_insts pcs - -- b) imported instance decls (not in the home package) inst_env1 - -- c) other modules in this package (gotten from hst) inst_env2 - -- d) local instance decls inst_env3 - -- e) generic instances inst_env4 - -- The result of (b) replaces the cached InstEnv in the PCS - let - local_inst_info = catMaybes local_inst_infos - hst_dfuns = foldModuleEnv ((++) . md_insts) [] hst - in - --- pprTrace "tcInstDecls" (vcat [ppr imported_dfuns, ppr hst_dfuns]) $ - - addInstDFuns inst_env0 imported_dfuns `thenNF_Tc` \ inst_env1 -> - addInstDFuns inst_env1 hst_dfuns `thenNF_Tc` \ inst_env2 -> - addInstInfos inst_env2 local_inst_info `thenNF_Tc` \ inst_env3 -> - addInstInfos inst_env3 generic_inst_info `thenNF_Tc` \ inst_env4 -> + -- a) imported instance decls (from this module) inst_env1 + -- b) local instance decls inst_env2 + -- c) generic instances final_inst_env + addInstInfos inst_env local_inst_info `thenNF_Tc` \ inst_env1 -> + addInstInfos inst_env1 generic_inst_info `thenNF_Tc` \ inst_env2 -> -- (3) Compute instances from "deriving" clauses; -- note that we only do derivings for things in this module; -- we ignore deriving decls from interfaces! -- This stuff computes a context for the derived instance decl, so it -- needs to know about all the instances possible; hence inst_env4 - tcDeriving prs this_mod inst_env4 get_fixity tycl_decls - `thenTc` \ (deriv_inst_info, deriv_binds) -> - addInstInfos inst_env4 deriv_inst_info `thenNF_Tc` \ final_inst_env -> + tcDeriving prs this_mod inst_env2 + get_fixity tycl_decls `thenTc` \ (deriv_inst_info, deriv_binds) -> + addInstInfos inst_env2 deriv_inst_info `thenNF_Tc` \ final_inst_env -> - returnTc (inst_env1, - final_inst_env, + returnTc (final_inst_env, generic_inst_info ++ deriv_inst_info ++ local_inst_info, deriv_binds) +initInstEnv :: PersistentCompilerState -> HomeSymbolTable -> NF_TcM InstEnv +-- Initialise the instance environment from the +-- persistent compiler state and the home symbol table +initInstEnv pcs hst + = let + pkg_inst_env = pcs_insts pcs + hst_dfuns = foldModuleEnv ((++) . md_insts) [] hst + in + addInstDFuns pkg_inst_env hst_dfuns + addInstInfos :: InstEnv -> [InstInfo] -> NF_TcM InstEnv addInstInfos inst_env infos = addInstDFuns inst_env (map iDFunId infos) @@ -231,12 +235,15 @@ addInstDFuns inst_env dfuns \end{code} \begin{code} -tcImportedInstDecl1 :: RenamedInstDecl -> NF_TcM DFunId +tcIfaceInstDecls1 :: [RenamedInstDecl] -> NF_TcM [DFunId] +tcIfaceInstDecls1 decls = mapNF_Tc tcIfaceInstDecl1 decls + +tcIfaceInstDecl1 :: RenamedInstDecl -> NF_TcM DFunId -- An interface-file instance declaration -- Should be in scope by now, because we should -- have sucked in its interface-file definition -- So it will be replete with its unfolding etc -tcImportedInstDecl1 decl@(InstDecl poly_ty binds uprags (Just dfun_name) src_loc) +tcIfaceInstDecl1 decl@(InstDecl poly_ty binds uprags (Just dfun_name) src_loc) = tcLookupId dfun_name