[project @ 1998-01-29 12:46:11 by simonpj]
authorsimonpj <unknown>
Thu, 29 Jan 1998 12:46:13 +0000 (12:46 +0000)
committersimonpj <unknown>
Thu, 29 Jan 1998 12:46:13 +0000 (12:46 +0000)
Fix interaction of "hiding" on import with "module M" on export

ghc/compiler/rename/RnEnv.lhs
ghc/compiler/rename/RnNames.lhs

index f975e91..551c6c4 100644 (file)
@@ -484,16 +484,29 @@ pprFixityProvenance (fixity, how_in_scope) = ppr how_in_scope
 
 
 
-===============  Avails  ================
+===============  ExportAvails  ================
 \begin{code}
-mkExportAvails :: Bool -> Module -> [AvailInfo] -> ExportAvails
-mkExportAvails unqualified_import mod_name avails
+mkExportAvails :: Module -> Bool -> GlobalNameEnv -> [AvailInfo] -> ExportAvails
+mkExportAvails mod_name unqual_imp name_env avails
   = (mod_avail_env, entity_avail_env)
   where
-       -- The "module M" syntax only applies to *unqualified* imports (1.4 Report, Section 5.1.1)
-    mod_avail_env | unqualified_import = unitFM mod_name avails 
-                 | otherwise          = emptyFM
-   
+    mod_avail_env = unitFM mod_name unqual_avails 
+
+       -- unqual_avails is the Avails that are visible in *unqualfied* form
+       -- (1.4 Report, Section 5.1.1)
+       -- For example, in 
+       --      import T hiding( f )
+       -- we delete f from avails
+
+    unqual_avails | not unqual_imp = []        -- Short cut when no unqualified imports
+                 | otherwise      = [prune avail | avail <- avails]
+
+    prune (Avail n) | unqual_in_scope n = Avail n
+    prune (Avail n) | otherwise                = NotAvailable
+    prune (AvailTC n ns)               = AvailTC n (filter unqual_in_scope ns)
+
+    unqual_in_scope n = Unqual (nameOccName n) `elemFM` name_env
+
     entity_avail_env = listToUFM [ (name,avail) | avail <- avails, 
                                                  name  <- availEntityNames avail]
 
@@ -556,8 +569,8 @@ filterAvail ie@(IEThingWith want wants) avail@(AvailTC n ns)
     avail_occs    = map nameOccName ns
     wanted_occs    = map rdrNameOcc (want:wants)
 
-filterAvail (IEThingAbs _) (AvailTC n ns)      
-  | n `elem` ns = AvailTC n [n]
+filterAvail (IEThingAbs _) (AvailTC n ns)       = ASSERT( n `elem` ns ) 
+                                                 AvailTC n [n]
 
 filterAvail (IEThingAbs _) avail@(Avail n)      = avail                -- Type synonyms
 
index a3ff994..f8cf4b1 100644 (file)
@@ -313,7 +313,7 @@ qualifyImports this_mod qual_imp unqual_imp as_mod hides
        fixity_env = foldl (add_fixity name_env2) emptyFixityEnv fixities
 
        -- Create the export-availability info
-       export_avails = mkExportAvails unqual_imp qual_mod avails
+       export_avails = mkExportAvails qual_mod unqual_imp name_env2 avails
     in
     returnRn (RnEnv name_env2 fixity_env, export_avails)
   where