X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=ghc%2Fcompiler%2Frename%2FRnNames.lhs;h=078863f83cd0f8d6e5b2d6418170e3799e6b6fcc;hb=c5ba8422faef9ee65d28e706c320cc334f9e97b6;hp=a0613ab3ab03eabfacc98fca8f2ffd6d5b3280e8;hpb=2767767f7b4acf89f56d18231f143b60429631f6;p=ghc-hetmet.git diff --git a/ghc/compiler/rename/RnNames.lhs b/ghc/compiler/rename/RnNames.lhs index a0613ab..078863f 100644 --- a/ghc/compiler/rename/RnNames.lhs +++ b/ghc/compiler/rename/RnNames.lhs @@ -32,7 +32,7 @@ import NameSet import NameEnv import HscTypes ( Provenance(..), ImportReason(..), GlobalRdrEnv, GenAvailInfo(..), AvailInfo, Avails, AvailEnv, - Deprecations(..), ModIface(..) + Deprecations(..), ModIface(..), emptyAvailEnv ) import RdrName ( rdrNameOcc, setRdrNameOcc ) import OccName ( setOccNameSpace, dataName ) @@ -178,7 +178,7 @@ importsFromImportDecl this_mod_name (ImportDecl imp_mod_name from qual_only as_m mk_prov name = NonLocalDef (UserImport imp_mod iloc (name `elemNameSet` explicits)) gbl_env = mkGlobalRdrEnv qual_mod unqual_imp mk_prov filtered_avails hides deprecs - exports = mkExportAvails qual_mod unqual_imp gbl_env filtered_avails + exports = mkExportAvails qual_mod unqual_imp gbl_env hides filtered_avails in returnRn (gbl_env, exports) \end{code} @@ -220,7 +220,7 @@ importsFromLocalDecls this_mod decls -- the defn of a non-deprecated thing, when changing a module's -- interface - exports = mkExportAvails mod_name unqual_imp gbl_env avails + exports = mkExportAvails mod_name unqual_imp gbl_env hides avails in returnRn (gbl_env, exports) @@ -367,8 +367,8 @@ filterImports mod from (Just (want_hiding, import_items)) total_avails mkEmptyExportAvails :: ModuleName -> ExportAvails mkEmptyExportAvails mod_name = (unitFM mod_name [], emptyNameEnv) -mkExportAvails :: ModuleName -> Bool -> GlobalRdrEnv -> [AvailInfo] -> ExportAvails -mkExportAvails mod_name unqual_imp gbl_env avails +mkExportAvails :: ModuleName -> Bool -> GlobalRdrEnv -> [AvailInfo] -> [AvailInfo] -> ExportAvails +mkExportAvails mod_name unqual_imp gbl_env hides avails = (mod_avail_env, entity_avail_env) where mod_avail_env = unitFM mod_name unqual_avails @@ -383,7 +383,7 @@ mkExportAvails mod_name unqual_imp gbl_env avails | otherwise = mapMaybe prune avails prune (Avail n) | unqual_in_scope n = Just (Avail n) - prune (Avail n) | otherwise = Nothing + | otherwise = Nothing prune (AvailTC n ns) | null uqs = Nothing | otherwise = Just (AvailTC n uqs) where @@ -391,8 +391,30 @@ mkExportAvails mod_name unqual_imp gbl_env avails unqual_in_scope n = unQualInScope gbl_env n - entity_avail_env = mkNameEnv [ (name,avail) | avail <- avails, - name <- availNames avail] + + entity_avail_env = mkNameEnv ([ (availName avail,avail) | avail <- effective_avails ] ++ + -- sigh - need to have the method/field names in + -- the environment also, so that export lists + -- can be computed precisely (cf. exportsFromAvail) + [ (name,avail) | avail <- effective_avails, + name <- avNames avail ] ) + + avNames (Avail n) = [n] + avNames (AvailTC n ns) = filter (/=n) ns + + -- remove 'hides' names from the avail list. + effective_avails = foldl wipeOut avails hides + where + wipeOut as (Avail n) = mapMaybe (delName n) as + wipeOut as (AvailTC n ns) = foldl wipeOut as (map Avail ns) + + delName x a@(Avail n) + | n == x = Nothing + | otherwise = Just a + delName x (AvailTC n ns) + = case (filter (/=x) ns) of + [] -> Nothing + xs -> Just (AvailTC n xs) plusExportAvails :: ExportAvails -> ExportAvails -> ExportAvails plusExportAvails (m1, e1) (m2, e2)