- -- 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
+