X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=compiler%2Fiface%2FMkIface.lhs;h=188aa45baae0d606060f3f006675bc32742aee05;hb=c97ae5d4900e5807fe0c8a198a3cad326f2d19c3;hp=a7bf168f695f9265912ed42d4529b4e9cfe7d59e;hpb=f757a5b168fbd2f3f40056f37aa8613117e9a3da;p=ghc-hetmet.git diff --git a/compiler/iface/MkIface.lhs b/compiler/iface/MkIface.lhs index a7bf168..188aa45 100644 --- a/compiler/iface/MkIface.lhs +++ b/compiler/iface/MkIface.lhs @@ -4,13 +4,6 @@ % \begin{code} -{-# OPTIONS -w #-} --- The above warning supression flag is a temporary kludge. --- While working on this module you are encouraged to remove it and fix --- any warnings in the module. See --- http://hackage.haskell.org/trac/ghc/wiki/Commentary/CodingStyle#Warnings --- for details - module MkIface ( mkUsedNames, mkDependencies, @@ -211,6 +204,7 @@ import DynFlags import VarEnv import Var import Name +import RdrName import NameEnv import NameSet import OccName @@ -220,10 +214,9 @@ import Unique import ErrUtils import Digraph import SrcLoc -import PackageConfig hiding ( Version ) import Outputable import BasicTypes hiding ( SuccessFlag(..) ) -import UniqFM +import LazyUniqFM import Util hiding ( eqListBy ) import FiniteMap import FastString @@ -233,6 +226,7 @@ import ListSetOps import Control.Monad import Data.List import Data.IORef +import System.FilePath \end{code} @@ -319,8 +313,6 @@ mkDependencies -- on M.hi-boot, and hence that we should do the hi-boot consistency -- check.) - dir_imp_mods = imp_mods imports - -- Modules don't compare lexicographically usually, -- but we want them to do so here. le_mod :: Module -> Module -> Bool @@ -342,6 +334,12 @@ mkDependencies -- sort to get into canonical order +mkIface_ :: HscEnv -> Maybe ModIface -> Module -> IsBootInterface + -> NameSet -> Dependencies -> GlobalRdrEnv + -> NameEnv FixItem -> Deprecations -> HpcInfo + -> ModuleEnv (Module, [(ModuleName, Bool, SrcSpan)]) + -> ModDetails + -> IO (ModIface, Bool) mkIface_ hsc_env maybe_old_iface this_mod is_boot used_names deps rdr_env fix_env src_deprecs hpc_info dir_imp_mods @@ -465,7 +463,7 @@ mkIface_ hsc_env maybe_old_iface ----------------------------- writeIfaceFile :: DynFlags -> ModLocation -> ModIface -> IO () writeIfaceFile dflags location new_iface - = do createDirectoryHierarchy (directoryOf hi_file_path) + = do createDirectoryHierarchy (takeDirectory hi_file_path) writeBinIface dflags hi_file_path new_iface where hi_file_path = ml_hi_file location @@ -508,7 +506,7 @@ addVersionInfo SDoc, -- Differences Maybe SDoc) -- Warnings about orphans -addVersionInfo ver_fn Nothing new_iface new_decls +addVersionInfo _ Nothing new_iface new_decls -- No old interface, so definitely write a new one! = (new_iface { mi_orphan = not (null orph_insts && null orph_rules) , mi_finsts = not . null $ mi_fam_insts new_iface @@ -517,7 +515,7 @@ addVersionInfo ver_fn Nothing new_iface new_decls new_decls) }, False, - ptext SLIT("No old interface file"), + ptext (sLit "No old interface file"), pprOrphans orph_insts orph_rules) where orph_insts = filter (isNothing . ifInstOrph) (mi_insts new_iface) @@ -533,9 +531,9 @@ addVersionInfo ver_fn (Just old_iface@(ModIface { new_iface@(ModIface { mi_fix_fn = new_fixities }) new_decls | no_change_at_all - = (old_iface, True, ptext SLIT("Interface file unchanged"), pp_orphs) + = (old_iface, True, ptext (sLit "Interface file unchanged"), pp_orphs) | otherwise - = (final_iface, False, vcat [ptext SLIT("Interface file has changed"), + = (final_iface, False, vcat [ptext (sLit "Interface file has changed"), nest 2 pp_diffs], pp_orphs) where final_iface = new_iface { @@ -592,8 +590,8 @@ addVersionInfo ver_fn (Just old_iface@(ModIface { pp_change no_deprec_change "Deprecations" empty, pp_change no_other_changes "Usages" empty, pp_decl_diffs] - pp_change True what info = empty - pp_change False what info = text what <+> ptext SLIT("changed") <+> info + pp_change True _ _ = empty + pp_change False what info = text what <+> ptext (sLit "changed") <+> info ------------------- old_decl_env = mkOccEnv [(ifName decl, decl) | (_,decl) <- old_decls] @@ -638,7 +636,7 @@ addVersionInfo ver_fn (Just old_iface@(ModIface { eq_indirects (IfaceData {ifName = tc_occ, ifCons = cons}) = same_insts tc_occ &&& same_fixity tc_occ &&& -- The TyCon can have a fixity too eq_ind_occs (map ifConOcc (visibleIfConDecls cons)) - eq_indirects other = Equal -- Synonyms and foreign declarations + eq_indirects _ = Equal -- Synonyms and foreign declarations eq_ind_occ :: OccName -> IfaceEq -- For class ops and Ids; check fixity and rules eq_ind_occ occ = same_fixity occ &&& same_rules occ @@ -655,8 +653,8 @@ addVersionInfo ver_fn (Just old_iface@(ModIface { pp_decl_diffs | isEmptyOccSet changed_occs = empty | otherwise - = vcat [ptext SLIT("Changed occs:") <+> ppr (occSetElts changed_occs), - ptext SLIT("Version change for these decls:"), + = vcat [ptext (sLit "Changed occs:") <+> ppr (occSetElts changed_occs), + ptext (sLit "Version change for these decls:"), nest 2 (vcat (map show_change new_decls))] eq_env = mkOccEnv eq_info @@ -668,30 +666,31 @@ addVersionInfo ver_fn (Just old_iface@(ModIface { where occ = ifName new_decl why = case lookupOccEnv eq_env occ of - Just (EqBut names) -> sep [ppr occ <> colon, ptext SLIT("Free vars (only) changed:") <> ppr names, + Just (EqBut names) -> sep [ppr occ <> colon, ptext (sLit "Free vars (only) changed:") <> ppr names, nest 2 (braces (fsep (map ppr (occSetElts (occs `intersectOccSet` changed_occs)))))] where occs = mkOccSet (map nameOccName (nameSetToList names)) Just NotEqual | Just old_decl <- lookupOccEnv old_decl_env occ - -> vcat [ptext SLIT("Old:") <+> ppr old_decl, - ptext SLIT("New:") <+> ppr new_decl] + -> vcat [ptext (sLit "Old:") <+> ppr old_decl, + ptext (sLit "New:") <+> ppr new_decl] | otherwise - -> ppr occ <+> ptext SLIT("only in new interface") - other -> pprPanic "MkIface.show_change" (ppr occ) + -> ppr occ <+> ptext (sLit "only in new interface") + _ -> pprPanic "MkIface.show_change" (ppr occ) pp_orphs = pprOrphans new_orph_insts new_orph_rules +pprOrphans :: [IfaceInst] -> [IfaceRule] -> Maybe SDoc pprOrphans insts rules | null insts && null rules = Nothing | otherwise = Just $ vcat [ if null insts then empty else - hang (ptext SLIT("Warning: orphan instances:")) + hang (ptext (sLit "Warning: orphan instances:")) 2 (vcat (map ppr insts)), if null rules then empty else - hang (ptext SLIT("Warning: orphan rules:")) + hang (ptext (sLit "Warning: orphan rules:")) 2 (vcat (map ppr rules)) ] @@ -714,7 +713,7 @@ computeChangedOccs ver_fn this_module old_usages eq_info Just v <- lookupUFM ents parent_occ = v < new_version | modulePackageId mod == this_pkg - = WARN(True, ptext SLIT("computeChangedOccs") <+> ppr nm) True + = WARN(True, ptext (sLit "computeChangedOccs") <+> ppr nm) True -- should really be a panic, see #1959. The problem is that the usages doesn't -- contain all the names that might be referred to by unfoldings. So as a -- conservative workaround we just assume these names have changed. @@ -745,7 +744,7 @@ computeChangedOccs ver_fn this_module old_usages eq_info | node@(occ, iface_eq) <- local_eq_infos , let occs = case iface_eq of EqBut occ_set -> occSetElts occ_set - other -> [] ] + _ -> [] ] -- Changes in declarations add_changes :: OccSet -> SCC (OccName, OccIfaceEq) -> OccSet @@ -757,26 +756,26 @@ computeChangedOccs ver_fn this_module old_usages eq_info -- One of this group has changed = extendOccSetList so_far occs where (occs, iface_eqs) = unzip pairs - add_changes so_far other = so_far + add_changes so_far _ = so_far type OccIfaceEq = GenIfaceEq OccName changedWrt :: OccSet -> OccIfaceEq -> Bool -changedWrt so_far Equal = False -changedWrt so_far NotEqual = True +changedWrt _ Equal = False +changedWrt _ NotEqual = True changedWrt so_far (EqBut kids) = so_far `intersectsOccSet` kids changedWrtNames :: OccSet -> IfaceEq -> Bool -changedWrtNames so_far Equal = False -changedWrtNames so_far NotEqual = True +changedWrtNames _ Equal = False +changedWrtNames _ NotEqual = True changedWrtNames so_far (EqBut kids) = so_far `intersectsOccSet` mkOccSet (map nameOccName (nameSetToList kids)) and_occifeq :: OccIfaceEq -> OccIfaceEq -> OccIfaceEq Equal `and_occifeq` x = x -NotEqual `and_occifeq` x = NotEqual +NotEqual `and_occifeq` _ = NotEqual EqBut nms `and_occifeq` Equal = EqBut nms -EqBut nms `and_occifeq` NotEqual = NotEqual +EqBut _ `and_occifeq` NotEqual = NotEqual EqBut nms1 `and_occifeq` EqBut nms2 = EqBut (nms1 `unionOccSets` nms2) ---------------------- @@ -995,9 +994,11 @@ checkOldIface hsc_env mod_summary source_unchanged maybe_iface check_old_iface hsc_env mod_summary source_unchanged maybe_iface } +check_old_iface :: HscEnv -> ModSummary -> Bool -> Maybe ModIface + -> IfG (Bool, Maybe ModIface) check_old_iface hsc_env mod_summary source_unchanged maybe_iface = do -- CHECK WHETHER THE SOURCE HAS CHANGED - { ifM (not source_unchanged) + { when (not source_unchanged) (traceHiDiffs (nest 4 (text "Source file changed or recompilation check turned off"))) -- If the source has changed and we're in interactive mode, avoid reading @@ -1029,7 +1030,7 @@ check_old_iface hsc_env mod_summary source_unchanged maybe_iface -- We have got the old iface; check its versions { traceIf (text "Read the interface file" <+> text iface_path) ; recomp <- checkVersions hsc_env source_unchanged mod_summary iface - ; returnM (recomp, Just iface) + ; return (recomp, Just iface) }}}}} \end{code} @@ -1041,6 +1042,7 @@ check their versions. \begin{code} type RecompileRequired = Bool +upToDate, outOfDate :: Bool upToDate = False -- Recompile not required outOfDate = True -- Recompile required @@ -1051,7 +1053,7 @@ checkVersions :: HscEnv -> IfG RecompileRequired checkVersions hsc_env source_unchanged mod_summary iface | not source_unchanged - = returnM outOfDate + = return outOfDate | otherwise = do { traceHiDiffs (text "Considering whether compilation is required for" <+> ppr (mi_module iface) <> colon) @@ -1105,7 +1107,7 @@ checkDependencies hsc_env summary iface where f m rest = do b <- m; if b then return True else rest dep_missing (L _ mod) = do - find_res <- ioToIOEnv $ findImportedModule hsc_env mod Nothing + find_res <- liftIO $ findImportedModule hsc_env mod Nothing case find_res of Found _ mod | pkg == this_pkg @@ -1137,21 +1139,18 @@ checkModUsage this_pkg (Usage { usg_name = mod_name, usg_mod = old_mod_vers, usg_rules = old_rule_vers, usg_exports = maybe_old_export_vers, usg_entities = old_decl_vers }) - = -- Load the imported interface is possible - let - doc_str = sep [ptext SLIT("need version info for"), ppr mod_name] - in - traceHiDiffs (text "Checking usages for module" <+> ppr mod_name) `thenM_` + = do -- Load the imported interface is possible + let doc_str = sep [ptext (sLit "need version info for"), ppr mod_name] + traceHiDiffs (text "Checking usages for module" <+> ppr mod_name) - let - mod = mkModule this_pkg mod_name - in - loadInterface doc_str mod ImportBySystem `thenM` \ mb_iface -> + let mod = mkModule this_pkg mod_name + + mb_iface <- loadInterface doc_str mod ImportBySystem -- Load the interface, but don't complain on failure; -- Instead, get an Either back which we can test case mb_iface of { - Failed exn -> (out_of_date (sep [ptext SLIT("Can't find version number for module"), + Failed _ -> (out_of_date (sep [ptext (sLit "Can't find version number for module"), ppr mod_name])); -- Couldn't find or parse a module mentioned in the -- old interface file. Don't complain -- it might just be that @@ -1165,72 +1164,79 @@ checkModUsage this_pkg (Usage { usg_name = mod_name, usg_mod = old_mod_vers, new_rule_vers = mi_rule_vers iface in -- CHECK MODULE - checkModuleVersion old_mod_vers new_mod_vers `thenM` \ recompile -> + checkModuleVersion old_mod_vers new_mod_vers >>= \ recompile -> if not recompile then - returnM upToDate + return upToDate else -- CHECK EXPORT LIST if checkExportList maybe_old_export_vers new_export_vers then - out_of_date_vers (ptext SLIT(" Export list changed")) + out_of_date_vers (ptext (sLit " Export list changed")) (expectJust "checkModUsage" maybe_old_export_vers) new_export_vers else -- CHECK RULES if old_rule_vers /= new_rule_vers then - out_of_date_vers (ptext SLIT(" Rules changed")) + out_of_date_vers (ptext (sLit " Rules changed")) old_rule_vers new_rule_vers else -- CHECK ITEMS ONE BY ONE - checkList [checkEntityUsage new_decl_vers u | u <- old_decl_vers] `thenM` \ recompile -> + checkList [checkEntityUsage new_decl_vers u | u <- old_decl_vers] >>= \ recompile -> if recompile then - returnM outOfDate -- This one failed, so just bail out now + return outOfDate -- This one failed, so just bail out now else - up_to_date (ptext SLIT(" Great! The bits I use are up to date")) + up_to_date (ptext (sLit " Great! The bits I use are up to date")) } ------------------------ +checkModuleVersion :: Version -> Version -> IfG Bool checkModuleVersion old_mod_vers new_mod_vers | new_mod_vers == old_mod_vers - = up_to_date (ptext SLIT("Module version unchanged")) + = up_to_date (ptext (sLit "Module version unchanged")) | otherwise - = out_of_date_vers (ptext SLIT(" Module version has changed")) + = out_of_date_vers (ptext (sLit " Module version has changed")) old_mod_vers new_mod_vers ------------------------ -checkExportList Nothing new_vers = upToDate +checkExportList :: Maybe Version -> Version -> Bool +checkExportList Nothing _ = upToDate checkExportList (Just v) new_vers = v /= new_vers ------------------------ +checkEntityUsage :: (OccName -> Maybe (OccName, Version)) + -> (OccName, Version) + -> IfG Bool checkEntityUsage new_vers (name,old_vers) = case new_vers name of Nothing -> -- We used it before, but it ain't there now - out_of_date (sep [ptext SLIT("No longer exported:"), ppr name]) + out_of_date (sep [ptext (sLit "No longer exported:"), ppr name]) Just (_, new_vers) -- It's there, but is it up to date? - | new_vers == old_vers -> traceHiDiffs (text " Up to date" <+> ppr name <+> parens (ppr new_vers)) `thenM_` - returnM upToDate - | otherwise -> out_of_date_vers (ptext SLIT(" Out of date:") <+> ppr name) + | new_vers == old_vers -> do traceHiDiffs (text " Up to date" <+> ppr name <+> parens (ppr new_vers)) + return upToDate + | otherwise -> out_of_date_vers (ptext (sLit " Out of date:") <+> ppr name) old_vers new_vers -up_to_date msg = traceHiDiffs msg `thenM_` returnM upToDate -out_of_date msg = traceHiDiffs msg `thenM_` returnM outOfDate +up_to_date, out_of_date :: SDoc -> IfG Bool +up_to_date msg = traceHiDiffs msg >> return upToDate +out_of_date msg = traceHiDiffs msg >> return outOfDate + +out_of_date_vers :: SDoc -> Version -> Version -> IfG Bool out_of_date_vers msg old_vers new_vers - = out_of_date (hsep [msg, ppr old_vers, ptext SLIT("->"), ppr new_vers]) + = out_of_date (hsep [msg, ppr old_vers, ptext (sLit "->"), ppr new_vers]) ---------------------- checkList :: [IfG RecompileRequired] -> IfG RecompileRequired -- This helper is used in two places -checkList [] = returnM upToDate -checkList (check:checks) = check `thenM` \ recompile -> - if recompile then - returnM outOfDate - else - checkList checks +checkList [] = return upToDate +checkList (check:checks) = do recompile <- check + if recompile + then return outOfDate + else checkList checks \end{code} %************************************************************************ @@ -1344,12 +1350,13 @@ tyThingToIfaceDecl (ADataCon dc) = pprPanic "toIfaceDecl" (ppr dc) -- Should be trimmed out earlier +getFS :: NamedThing a => a -> FastString getFS x = occNameFS (getOccName x) -------------------------- instanceToIfaceInst :: Instance -> IfaceInst -instanceToIfaceInst ispec@(Instance { is_dfun = dfun_id, is_flag = oflag, - is_cls = cls_name, is_tcs = mb_tcs }) +instanceToIfaceInst (Instance { is_dfun = dfun_id, is_flag = oflag, + is_cls = cls_name, is_tcs = mb_tcs }) = ASSERT( cls_name == className cls ) IfaceInst { ifDFun = dfun_name, ifOFlag = oflag, @@ -1377,18 +1384,19 @@ instanceToIfaceInst ispec@(Instance { is_dfun = dfun_id, is_flag = oflag, -- that is not in the "determined" arguments mb_ns | null fds = [choose_one arg_names] | otherwise = map do_one fds - do_one (ltvs,rtvs) = choose_one [ns | (tv,ns) <- tvs `zip` arg_names - , not (tv `elem` rtvs)] + do_one (_ltvs, rtvs) = choose_one [ns | (tv,ns) <- tvs `zip` arg_names + , not (tv `elem` rtvs)] choose_one :: [NameSet] -> Maybe OccName choose_one nss = case nameSetToList (unionManyNameSets nss) of - [] -> Nothing - (n:ns) -> Just (nameOccName n) + [] -> Nothing + (n : _) -> Just (nameOccName n) -------------------------- famInstToIfaceFamInst :: FamInst -> IfaceFamInst -famInstToIfaceFamInst fi@(FamInst { fi_tycon = tycon, - fi_fam = fam, fi_tcs = mb_tcs }) +famInstToIfaceFamInst (FamInst { fi_tycon = tycon, + fi_fam = fam, + fi_tcs = mb_tcs }) = IfaceFamInst { ifFamInstTyCon = toIfaceTyCon tycon , ifFamInstFam = fam , ifFamInstTys = map do_rough mb_tcs } @@ -1397,6 +1405,7 @@ famInstToIfaceFamInst fi@(FamInst { fi_tycon = tycon, do_rough (Just n) = Just (toIfaceTyCon_name n) -------------------------- +toIfaceLetBndr :: Id -> IfaceLetBndr toIfaceLetBndr id = IfLetBndr (occNameFS (getOccName id)) (toIfaceType (idType id)) prag_info @@ -1465,7 +1474,7 @@ toIfaceIdInfo id_info -------------------------- coreRuleToIfaceRule :: Module -> CoreRule -> IfaceRule -coreRuleToIfaceRule mod (BuiltinRule { ru_fn = fn}) +coreRuleToIfaceRule _ (BuiltinRule { ru_fn = fn}) = pprTrace "toHsRule: builtin" (ppr fn) $ bogusIfaceRule fn @@ -1494,12 +1503,12 @@ coreRuleToIfaceRule mod (Rule { ru_name = name, ru_fn = fn, -- exprsFreeNames finds only External names orph = case filter (nameIsLocalOrFrom mod) lhs_names of - (n:ns) -> Just (nameOccName n) - [] -> Nothing + (n : _) -> Just (nameOccName n) + [] -> Nothing bogusIfaceRule :: Name -> IfaceRule bogusIfaceRule id_name - = IfaceRule { ifRuleName = FSLIT("bogus"), ifActivation = NeverActive, + = IfaceRule { ifRuleName = fsLit "bogus", ifActivation = NeverActive, ifRuleBndrs = [], ifRuleHead = id_name, ifRuleArgs = [], ifRuleRhs = IfaceExt id_name, ifRuleOrph = Nothing } @@ -1516,18 +1525,23 @@ toIfaceExpr (Cast e co) = IfaceCast (toIfaceExpr e) (toIfaceType co) toIfaceExpr (Note n e) = IfaceNote (toIfaceNote n) (toIfaceExpr e) --------------------- +toIfaceNote :: Note -> IfaceNote toIfaceNote (SCC cc) = IfaceSCC cc toIfaceNote InlineMe = IfaceInlineMe toIfaceNote (CoreNote s) = IfaceCoreNote s --------------------- +toIfaceBind :: Bind Id -> IfaceBinding toIfaceBind (NonRec b r) = IfaceNonRec (toIfaceLetBndr b) (toIfaceExpr r) toIfaceBind (Rec prs) = IfaceRec [(toIfaceLetBndr b, toIfaceExpr r) | (b,r) <- prs] --------------------- +toIfaceAlt :: (AltCon, [Var], CoreExpr) + -> (IfaceConAlt, [FastString], IfaceExpr) toIfaceAlt (c,bs,r) = (toIfaceCon c, map getFS bs, toIfaceExpr r) --------------------- +toIfaceCon :: AltCon -> IfaceConAlt toIfaceCon (DataAlt dc) | isTupleTyCon tc = IfaceTupleAlt (tupleTyConBoxity tc) | otherwise = IfaceDataAlt (getName dc) where @@ -1537,6 +1551,7 @@ toIfaceCon (LitAlt l) = IfaceLitAlt l toIfaceCon DEFAULT = IfaceDefault --------------------- +toIfaceApp :: Expr CoreBndr -> [Arg CoreBndr] -> IfaceExpr toIfaceApp (App f a) as = toIfaceApp f (a:as) toIfaceApp (Var v) as = case isDataConWorkId_maybe v of @@ -1549,10 +1564,11 @@ toIfaceApp (Var v) as tup_args = map toIfaceExpr val_args tc = dataConTyCon dc - other -> mkIfaceApps (toIfaceVar v) as + _ -> mkIfaceApps (toIfaceVar v) as toIfaceApp e as = mkIfaceApps (toIfaceExpr e) as +mkIfaceApps :: IfaceExpr -> [CoreExpr] -> IfaceExpr mkIfaceApps f as = foldl (\f a -> IfaceApp f (toIfaceExpr a)) f as ---------------------