X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=compiler%2Frename%2FRnEnv.lhs;h=d3e1bdc2c58a536ff378587b210284b017c0383b;hb=d64022dc071b587c20a693b7f355f69dc110b707;hp=414a717dd7944aea335bfeca70ba62fd13e915a6;hpb=1e50fd4185479a62e02d987bdfcb1c62712859ca;p=ghc-hetmet.git diff --git a/compiler/rename/RnEnv.lhs b/compiler/rename/RnEnv.lhs index 414a717..d3e1bdc 100644 --- a/compiler/rename/RnEnv.lhs +++ b/compiler/rename/RnEnv.lhs @@ -12,13 +12,13 @@ module RnEnv ( lookupGlobalOccRn, lookupGlobalOccRn_maybe, lookupLocalDataTcNames, lookupSigOccRn, lookupFixityRn, lookupTyFixityRn, - lookupInstDeclBndr, lookupRecordBndr, lookupConstructorFields, + lookupInstDeclBndr, lookupLocatedSubBndr, lookupConstructorFields, lookupSyntaxName, lookupSyntaxTable, lookupGreRn, lookupGreLocalRn, lookupGreRn_maybe, getLookupOccRn, addUsedRdrNames, - newLocalsRn, newIPNameRn, - bindLocalNames, bindLocalNamesFV, + newLocalBndrRn, newLocalBndrsRn, newIPNameRn, + bindLocalName, bindLocalNames, bindLocalNamesFV, MiniFixityEnv, emptyFsEnv, extendFsEnv, lookupFsEnv, bindLocalNamesFV_WithFixities, bindLocatedLocalsFV, bindLocatedLocalsRn, @@ -30,9 +30,7 @@ module RnEnv ( mapFvRn, mapFvRnCPS, warnUnusedMatches, warnUnusedModules, warnUnusedImports, warnUnusedTopBinds, warnUnusedLocalBinds, - dataTcOccs, unknownNameErr, kindSigErr, perhapsForallMsg, - - checkM + dataTcOccs, unknownNameErr, kindSigErr, perhapsForallMsg ) where #include "HsVersions.h" @@ -55,8 +53,8 @@ import DataCon ( dataConFieldLabels ) import OccName import Module ( Module, ModuleName ) import PrelNames ( mkUnboundName, rOOT_MAIN, iNTERACTIVE, - consDataConKey, hasKey, forall_tv_RDR ) -import UniqSupply + consDataConKey, forall_tv_RDR ) +import Unique import BasicTypes import ErrUtils ( Message ) import SrcLoc @@ -75,21 +73,6 @@ import qualified Data.Set as Set -- XXX thenM :: Monad a => a b -> (b -> a c) -> a c thenM = (>>=) - -thenM_ :: Monad a => a b -> a c -> a c -thenM_ = (>>) - -returnM :: Monad m => a -> m a -returnM = return - -mappM :: (Monad m) => (a -> m b) -> [a] -> m [b] -mappM = mapM - -mappM_ :: (Monad m) => (a -> m b) -> [a] -> m () -mappM_ = mapM_ - -checkM :: Monad m => Bool -> m () -> m () -checkM = unless \end{code} %********************************************************* @@ -112,13 +95,13 @@ newTopSrcBinder this_mod (L loc rdr_name) -- data T = (,) Int Int -- unless we are in GHC.Tup ASSERT2( isExternalName name, ppr name ) - do { checkM (this_mod == nameModule name) + do { unless (this_mod == nameModule name) (addErrAt loc (badOrigBinding rdr_name)) ; return name } | Just (rdr_mod, rdr_occ) <- isOrig_maybe rdr_name - = do { checkM (rdr_mod == this_mod || rdr_mod == rOOT_MAIN) + = do { unless (rdr_mod == this_mod || rdr_mod == rOOT_MAIN) (addErrAt loc (badOrigBinding rdr_name)) -- When reading External Core we get Orig names as binders, -- but they should agree with the module gotten from the monad @@ -141,7 +124,7 @@ newTopSrcBinder this_mod (L loc rdr_name) --TODO, should pass the whole span | otherwise - = do { checkM (not (isQual rdr_name)) + = do { unless (not (isQual rdr_name)) (addErrAt loc (badQualBndrErr rdr_name)) -- Binders should not be qualified; if they are, and with a different -- module name, we we get a confusing "M.T is not in scope" error later @@ -207,7 +190,7 @@ lookupTopBndrRn_maybe :: RdrName -> RnM (Maybe Name) lookupTopBndrRn_maybe rdr_name | Just name <- isExact_maybe rdr_name - = returnM (Just name) + = return (Just name) | Just (rdr_mod, rdr_occ) <- isOrig_maybe rdr_name -- This deals with the case of derived bindings, where @@ -223,12 +206,12 @@ lookupTopBndrRn_maybe rdr_name let occ = rdrNameOcc rdr_name ; when (isTcOcc occ && isSymOcc occ) (do { op_ok <- doptM Opt_TypeOperators - ; checkM op_ok (addErr (opDeclErr rdr_name)) }) + ; unless op_ok (addErr (opDeclErr rdr_name)) }) ; mb_gre <- lookupGreLocalRn rdr_name ; case mb_gre of - Nothing -> returnM Nothing - Just gre -> returnM (Just $ gre_name gre) } + Nothing -> return Nothing + Just gre -> return (Just $ gre_name gre) } ----------------------------------------------- @@ -244,40 +227,11 @@ lookupInstDeclBndr :: Name -> Located RdrName -> RnM (Located Name) -- name is only in scope qualified. I.e. even if method op is -- in scope as M.op, we still allow plain 'op' on the LHS of -- an instance decl -lookupInstDeclBndr cls rdr = lookup_located_sub_bndr is_op doc rdr +lookupInstDeclBndr cls rdr = lookupLocatedSubBndr (ParentIs cls) doc rdr where doc = ptext (sLit "method of class") <+> quotes (ppr cls) - is_op (GRE {gre_par = ParentIs n}) = n == cls - is_op _ = False ----------------------------------------------- -lookupRecordBndr :: Maybe (Located Name) -> Located RdrName -> RnM (Located Name) --- Used for record construction and pattern matching --- When the -XDisambiguateRecordFields flag is on, take account of the --- constructor name to disambiguate which field to use; it's just the --- same as for instance decls --- --- NB: Consider this: --- module Foo where { data R = R { fld :: Int } } --- module Odd where { import Foo; fld x = x { fld = 3 } } --- Arguably this should work, because the reference to 'fld' is --- unambiguous because there is only one field id 'fld' in scope. --- But currently it's rejected. -lookupRecordBndr Nothing rdr_name - = lookupLocatedGlobalOccRn rdr_name -lookupRecordBndr (Just (L _ data_con)) rdr_name - = do { flag_on <- doptM Opt_DisambiguateRecordFields - ; if not flag_on - then lookupLocatedGlobalOccRn rdr_name - else do { - fields <- lookupConstructorFields data_con - ; let is_field gre = gre_name gre `elem` fields - ; lookup_located_sub_bndr is_field doc rdr_name - }} - where - doc = ptext (sLit "field of constructor") <+> quotes (ppr data_con) - - lookupConstructorFields :: Name -> RnM [Name] -- Look up the fields of a given constructor -- * For constructors from this module, use the record field env, @@ -298,34 +252,57 @@ lookupConstructorFields con_name ; return (dataConFieldLabels con) } } ----------------------------------------------- -lookup_located_sub_bndr :: (GlobalRdrElt -> Bool) +-- Used for record construction and pattern matching +-- When the -XDisambiguateRecordFields flag is on, take account of the +-- constructor name to disambiguate which field to use; it's just the +-- same as for instance decls +-- +-- NB: Consider this: +-- module Foo where { data R = R { fld :: Int } } +-- module Odd where { import Foo; fld x = x { fld = 3 } } +-- Arguably this should work, because the reference to 'fld' is +-- unambiguous because there is only one field id 'fld' in scope. +-- But currently it's rejected. + +lookupLocatedSubBndr :: Parent -- NoParent => just look it up as usual + -- ParentIs p => use p to disambiguate -> SDoc -> Located RdrName -> RnM (Located Name) -lookup_located_sub_bndr is_good doc rdr_name - = wrapLocM (lookup_sub_bndr is_good doc) rdr_name - -lookup_sub_bndr :: (GlobalRdrElt -> Bool) -> SDoc -> RdrName -> RnM Name -lookup_sub_bndr is_good doc rdr_name - | isUnqual rdr_name -- Find all the things the rdr-name maps to - = do { -- and pick the one with the right parent name - ; addUsedRdrName rdr_name +lookupLocatedSubBndr parent doc rdr_name + = wrapLocM (lookup_sub_bndr parent doc) rdr_name + +lookup_sub_bndr :: Parent -> SDoc -> RdrName -> RnM Name +lookup_sub_bndr parent doc rdr_name + | Just n <- isExact_maybe rdr_name -- This happens in derived code + = return n + + | Just (rdr_mod, rdr_occ) <- isOrig_maybe rdr_name + = lookupOrig rdr_mod rdr_occ + + | otherwise -- Find all the things the rdr-name maps to + = do { -- and pick the one with the right parent name ; env <- getGlobalRdrEnv - ; case filter is_good (lookupGlobalRdrEnv env (rdrNameOcc rdr_name)) of + ; let gres = (lookupGlobalRdrEnv env (rdrNameOcc rdr_name)) + ; case pick parent gres of -- NB: lookupGlobalRdrEnv, not lookupGRE_RdrName! -- The latter does pickGREs, but we want to allow 'x' -- even if only 'M.x' is in scope - [gre] -> return (gre_name gre) + [gre] -> do { addUsedRdrName gre rdr_name + ; return (gre_name gre) } [] -> do { addErr (unknownSubordinateErr doc rdr_name) - ; traceRn (text "RnEnv.lookup_sub_bndr" <+> ppr rdr_name) + ; traceRn (text "RnEnv.lookup_sub_bndr" <+> (ppr rdr_name $$ ppr gres)) ; return (mkUnboundName rdr_name) } gres -> do { addNameClashErrRn rdr_name gres - ; return (gre_name (head gres)) } - } + ; return (gre_name (head gres)) } } + where + pick NoParent gres -- Normal lookup + = pickGREs rdr_name gres + pick (ParentIs p) gres -- Disambiguating lookup + | isUnqual rdr_name = filter (right_parent p) gres + | otherwise = filter (right_parent p) (pickGREs rdr_name gres) - | otherwise -- Occurs in derived instances, where we just - -- refer directly to the right method with an Orig - -- And record fields can be Quals: C { F.f = x } - = lookupGlobalOccRn rdr_name + right_parent p (GRE { gre_par = ParentIs p' }) = p==p' + right_parent _ _ = False newIPNameRn :: IPName RdrName -> TcRnIf m n (IPName Name) newIPNameRn ip_rdr = newIPName (mapIPName rdrNameOcc ip_rdr) @@ -360,7 +337,7 @@ lookupOccRn :: RdrName -> RnM Name lookupOccRn rdr_name = getLocalRdrEnv `thenM` \ local_env -> case lookupLocalRdrEnv local_env rdr_name of - Just name -> returnM name + Just name -> return name Nothing -> lookupGlobalOccRn rdr_name lookupLocatedGlobalOccRn :: Located RdrName -> RnM (Located Name) @@ -413,7 +390,7 @@ unboundName rdr_name ; traceRn (vcat [unknownNameErr rdr_name, ptext (sLit "Global envt is:"), nest 3 (pprGlobalRdrEnv env)]) - ; returnM (mkUnboundName rdr_name) } + ; return (mkUnboundName rdr_name) } -------------------------------------------------- -- Lookup in the Global RdrEnv of the module @@ -422,27 +399,7 @@ unboundName rdr_name lookupGreRn_maybe :: RdrName -> RnM (Maybe GlobalRdrElt) -- Just look up the RdrName in the GlobalRdrEnv lookupGreRn_maybe rdr_name - = do { mGre <- lookupGreRn_help rdr_name (lookupGRE_RdrName rdr_name) - ; case mGre of - Just gre -> - case gre_prov gre of - LocalDef -> return () - Imported _ -> addUsedRdrName rdr_name - Nothing -> - return () - ; return mGre } - -addUsedRdrName :: RdrName -> RnM () -addUsedRdrName rdr - = do { env <- getGblEnv - ; updMutVar (tcg_used_rdrnames env) - (\s -> Set.insert rdr s) } - -addUsedRdrNames :: [RdrName] -> RnM () -addUsedRdrNames rdrs - = do { env <- getGblEnv - ; updMutVar (tcg_used_rdrnames env) - (\s -> foldr Set.insert s rdrs) } + = lookupGreRn_help rdr_name (lookupGRE_RdrName rdr_name) lookupGreRn :: RdrName -> RnM GlobalRdrElt -- If not found, add error message, and return a fake GRE @@ -471,10 +428,28 @@ lookupGreRn_help :: RdrName -- Only used in error message lookupGreRn_help rdr_name lookup = do { env <- getGlobalRdrEnv ; case lookup env of - [] -> returnM Nothing - [gre] -> returnM (Just gre) + [] -> return Nothing + [gre] -> do { addUsedRdrName gre rdr_name + ; return (Just gre) } gres -> do { addNameClashErrRn rdr_name gres - ; returnM (Just (head gres)) } } + ; return (Just (head gres)) } } + +addUsedRdrName :: GlobalRdrElt -> RdrName -> RnM () +-- Record usage of imported RdrNames +addUsedRdrName gre rdr + | isLocalGRE gre = return () + | otherwise = do { env <- getGblEnv + ; updMutVar (tcg_used_rdrnames env) + (\s -> Set.insert rdr s) } + +addUsedRdrNames :: [RdrName] -> RnM () +-- Record used sub-binders +-- We don't check for imported-ness here, because it's inconvenient +-- and not stritly necessary. +addUsedRdrNames rdrs + = do { env <- getGblEnv + ; updMutVar (tcg_used_rdrnames env) + (\s -> foldr Set.insert s rdrs) } ------------------------------ -- GHCi support @@ -715,7 +690,7 @@ lookupFixityRn name loadInterfaceForName doc name `thenM` \ iface -> do { traceRn (text "lookupFixityRn: looking up name in iface cache and found:" <+> vcat [ppr name, ppr $ mi_fix_fn iface (nameOccName name)]); - returnM (mi_fix_fn iface (nameOccName name)) + return (mi_fix_fn iface (nameOccName name)) } where doc = ptext (sLit "Checking fixity for") <+> ppr name @@ -774,9 +749,9 @@ lookupSyntaxName std_name else -- Get the similarly named thing from the local environment lookupOccRn (mkRdrUnqual (nameOccName std_name)) `thenM` \ usr_name -> - returnM (HsVar usr_name, unitFV usr_name) + return (HsVar usr_name, unitFV usr_name) where - normal_case = returnM (HsVar std_name, emptyFVs) + normal_case = return (HsVar std_name, emptyFVs) lookupSyntaxTable :: [Name] -- Standard names -> RnM (SyntaxTable Name, FreeVars) -- See comments with HsExpr.ReboundNames @@ -785,11 +760,11 @@ lookupSyntaxTable std_names if implicit_prelude then normal_case else -- Get the similarly named thing from the local environment - mappM (lookupOccRn . mkRdrUnqual . nameOccName) std_names `thenM` \ usr_names -> + mapM (lookupOccRn . mkRdrUnqual . nameOccName) std_names `thenM` \ usr_names -> - returnM (std_names `zip` map HsVar usr_names, mkFVs usr_names) + return (std_names `zip` map HsVar usr_names, mkFVs usr_names) where - normal_case = returnM (std_names `zip` map HsVar std_names, emptyFVs) + normal_case = return (std_names `zip` map HsVar std_names, emptyFVs) \end{code} @@ -800,18 +775,22 @@ lookupSyntaxTable std_names %********************************************************* \begin{code} -newLocalsRn :: [Located RdrName] -> RnM [Name] -newLocalsRn rdr_names_w_loc - = newUniqueSupply `thenM` \ us -> - returnM (zipWith mk rdr_names_w_loc (uniqsFromSupply us)) - where - mk (L loc rdr_name) uniq - | Just name <- isExact_maybe rdr_name = name - -- This happens in code generated by Template Haskell - | otherwise = ASSERT2( isUnqual rdr_name, ppr rdr_name ) - -- We only bind unqualified names here - -- lookupRdrEnv doesn't even attempt to look up a qualified RdrName - mkInternalName uniq (rdrNameOcc rdr_name) loc +newLocalBndrRn :: Located RdrName -> RnM Name +-- Used for non-top-level binders. These should +-- never be qualified. +newLocalBndrRn (L loc rdr_name) + | Just name <- isExact_maybe rdr_name + = return name -- This happens in code generated by Template Haskell + -- although I'm not sure why. Perhpas it's the call + -- in RnPat.newName LetMk? + | otherwise + = do { unless (isUnqual rdr_name) + (addErrAt loc (badQualBndrErr rdr_name)) + ; uniq <- newUnique + ; return (mkInternalName uniq (rdrNameOcc rdr_name) loc) } + +newLocalBndrsRn :: [Located RdrName] -> RnM [Name] +newLocalBndrsRn = mapM newLocalBndrRn --------------------- checkDupAndShadowedRdrNames :: SDoc -> [Located RdrName] -> RnM () @@ -823,26 +802,32 @@ checkDupAndShadowedRdrNames doc loc_rdr_names --------------------- bindLocatedLocalsRn :: SDoc -- Documentation string for error message - -> [Located RdrName] + -> [Located RdrName] -> ([Name] -> RnM a) -> RnM a bindLocatedLocalsRn doc_str rdr_names_w_loc enclosed_scope - = checkDupAndShadowedRdrNames doc_str rdr_names_w_loc `thenM_` + = do { checkDupAndShadowedRdrNames doc_str rdr_names_w_loc -- Make fresh Names and extend the environment - newLocalsRn rdr_names_w_loc `thenM` \names -> - bindLocalNames names (enclosed_scope names) + ; names <- newLocalBndrsRn rdr_names_w_loc + ; bindLocalNames names (enclosed_scope names) } bindLocalNames :: [Name] -> RnM a -> RnM a bindLocalNames names enclosed_scope - = getLocalRdrEnv `thenM` \ name_env -> - setLocalRdrEnv (extendLocalRdrEnv name_env names) - enclosed_scope + = do { name_env <- getLocalRdrEnv + ; setLocalRdrEnv (extendLocalRdrEnvList name_env names) + enclosed_scope } + +bindLocalName :: Name -> RnM a -> RnM a +bindLocalName name enclosed_scope + = do { name_env <- getLocalRdrEnv + ; setLocalRdrEnv (extendLocalRdrEnv name_env name) + enclosed_scope } bindLocalNamesFV :: [Name] -> RnM (a, FreeVars) -> RnM (a, FreeVars) bindLocalNamesFV names enclosed_scope = do { (result, fvs) <- bindLocalNames names enclosed_scope - ; returnM (result, delListFromNameSet fvs names) } + ; return (result, delListFromNameSet fvs names) } ------------------------------------- @@ -853,7 +838,7 @@ bindLocatedLocalsFV :: SDoc -> [Located RdrName] bindLocatedLocalsFV doc rdr_names enclosed_scope = bindLocatedLocalsRn doc rdr_names $ \ names -> enclosed_scope names `thenM` \ (thing, fvs) -> - returnM (thing, delListFromNameSet fvs names) + return (thing, delListFromNameSet fvs names) ------------------------------------- bindTyVarsRn :: SDoc -> [LHsTyVarBndr RdrName] @@ -863,7 +848,7 @@ bindTyVarsRn :: SDoc -> [LHsTyVarBndr RdrName] bindTyVarsRn doc_str tyvar_names enclosed_scope = bindLocatedLocalsRn doc_str located_tyvars $ \ names -> do { kind_sigs_ok <- doptM Opt_KindSignatures - ; checkM (null kinded_tyvars || kind_sigs_ok) + ; unless (null kinded_tyvars || kind_sigs_ok) (mapM_ (addErr . kindSigErr) kinded_tyvars) ; enclosed_scope (zipWith replace tyvar_names names) } where @@ -898,7 +883,7 @@ bindPatSigTyVarsFV :: [LHsType RdrName] bindPatSigTyVarsFV tys thing_inside = bindPatSigTyVars tys $ \ tvs -> thing_inside `thenM` \ (result,fvs) -> - returnM (result, fvs `delListFromNameSet` tvs) + return (result, fvs `delListFromNameSet` tvs) bindSigTyVarsFV :: [Name] -> RnM (a, FreeVars) @@ -920,7 +905,7 @@ checkDupRdrNames :: SDoc -> RnM () checkDupRdrNames doc_str rdr_names_w_loc = -- Check for duplicated names in a binding group - mappM_ (dupNamesErr getLoc doc_str) dups + mapM_ (dupNamesErr getLoc doc_str) dups where (_, dups) = removeDups (\n1 n2 -> unLoc n1 `compare` unLoc n2) rdr_names_w_loc @@ -929,7 +914,7 @@ checkDupNames :: SDoc -> RnM () checkDupNames doc_str names = -- Check for duplicated names in a binding group - mappM_ (dupNamesErr nameSrcSpan doc_str) dups + mapM_ (dupNamesErr nameSrcSpan doc_str) dups where (_, dups) = removeDups (\n1 n2 -> nameOccName n1 `compare` nameOccName n2) names @@ -938,7 +923,7 @@ checkShadowedNames :: SDoc -> (GlobalRdrEnv, LocalRdrEnv) -> [(SrcSpan,OccName)] checkShadowedNames doc_str (global_env,local_env) loc_rdr_names = ifOptM Opt_WarnNameShadowing $ do { traceRn (text "shadow" <+> ppr loc_rdr_names) - ; mappM_ check_shadow loc_rdr_names } + ; mapM_ check_shadow loc_rdr_names } where check_shadow (loc, occ) | startsWithUnderscore occ = return () -- Do not report shadowing for "_x" @@ -981,9 +966,9 @@ checkShadowedNames doc_str (global_env,local_env) loc_rdr_names \begin{code} -- A useful utility mapFvRn :: (a -> RnM (b, FreeVars)) -> [a] -> RnM ([b], FreeVars) -mapFvRn f xs = do stuff <- mappM f xs +mapFvRn f xs = do stuff <- mapM f xs case unzip stuff of - (ys, fvs_s) -> returnM (ys, plusFVs fvs_s) + (ys, fvs_s) -> return (ys, plusFVs fvs_s) -- because some of the rename functions are CPSed: -- maps the function across the list from left to right; @@ -1007,7 +992,7 @@ mapFvRnCPS f (x:xs) cont = f x $ \ x' -> \begin{code} warnUnusedModules :: [(ModuleName,SrcSpan)] -> RnM () warnUnusedModules mods - = ifOptM Opt_WarnUnusedImports (mappM_ bleat mods) + = ifOptM Opt_WarnUnusedImports (mapM_ bleat mods) where bleat (mod,loc) = addWarnAt loc (mk_warn mod) mk_warn m = vcat [ptext (sLit "Module") <+> quotes (ppr m) @@ -1041,7 +1026,7 @@ warnUnusedLocals names = warnUnusedBinds [(n,LocalDef) | n<-names] warnUnusedBinds :: [(Name,Provenance)] -> RnM () -warnUnusedBinds names = mappM_ warnUnusedName (filter reportable names) +warnUnusedBinds names = mapM_ warnUnusedName (filter reportable names) where reportable (name,_) | isWiredInName name = False -- Don't report unused wired-in names -- Otherwise we get a zillion warnings