-=============== RnEnv ================
-\begin{code}
-plusRnEnv (RnEnv n1 f1) (RnEnv n2 f2)
- = plusGlobalNameEnvRn n1 n2 `thenRn` \ n ->
- plusFixityEnvRn f1 f2 `thenRn` \ f ->
- returnRn (RnEnv n f)
-\end{code}
-
-
-=============== NameEnv ================
-\begin{code}
-plusGlobalNameEnvRn :: GlobalNameEnv -> GlobalNameEnv -> RnM s d GlobalNameEnv
-plusGlobalNameEnvRn env1 env2
- = mapRn (addErrRn.nameClashErr) (conflictsFM conflicting_name env1 env2) `thenRn_`
- returnRn (env1 `plusFM` env2)
-
-addOneToGlobalNameEnv :: GlobalNameEnv -> RdrName -> (Name, HowInScope) -> RnM s d GlobalNameEnv
-addOneToGlobalNameEnv env rdr_name name
- = case lookupFM env rdr_name of
- Just name2 | conflicting_name name name2
- -> addErrRn (nameClashErr (rdr_name, (name, name2))) `thenRn_`
- returnRn env
-
- other -> returnRn (addToFM env rdr_name name)
-
-delOneFromGlobalNameEnv :: GlobalNameEnv -> RdrName -> GlobalNameEnv
-delOneFromGlobalNameEnv env rdr_name = delFromFM env rdr_name
-
-conflicting_name :: (Name, HowInScope) -> (Name, HowInScope) -> Bool
-conflicting_name (n1, FromLocalDefn _) (n2, FromLocalDefn _) = True
-conflicting_name (n1,h1) (n2,h2) = n1 /= n2
- -- We complain of a conflict if one RdrName maps to two different Names,
- -- OR if one RdrName maps to the same *locally-defined* Name. The latter
- -- case is to catch two separate, local definitions of the same thing.
- --
- -- If a module imports itself then there might be a local defn and an imported
- -- defn of the same name; in this case the names will compare as equal, but
- -- will still have different HowInScope fields
-
-lookupNameEnv :: NameEnv -> RdrName -> Maybe Name
-lookupNameEnv = lookupFM
-\end{code}
-
-=============== FixityEnv ================
-\begin{code}
-plusFixityEnvRn f1 f2
- = mapRn (addErrRn.fixityClashErr) (conflictsFM bad_fix f1 f2) `thenRn_`
- returnRn (f1 `plusFM` f2)
-
-addOneToFixityEnv env rdr_name fixity = addToFM env rdr_name fixity
-
-lookupFixityEnv env rdr_name
- = case lookupFM env rdr_name of
- Just (fixity,_) -> fixity
- Nothing -> Fixity 9 InfixL -- Default case
-
-bad_fix :: (Fixity, HowInScope) -> (Fixity, HowInScope) -> Bool
-bad_fix (f1,_) (f2,_) = f1 /= f2
-
-pprFixityProvenance :: (Fixity, HowInScope) -> SDoc
-pprFixityProvenance (fixity, how_in_scope) = ppr how_in_scope
-\end{code}
-
-
-
-=============== ExportAvails ================
-\begin{code}
-mkExportAvails :: Module -> Bool -> GlobalNameEnv -> [AvailInfo] -> ExportAvails
-mkExportAvails mod_name unqual_imp name_env avails
- = (mod_avail_env, entity_avail_env)
- where
- 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]
-
-plusExportAvails :: ExportAvails -> ExportAvails -> ExportAvails
-plusExportAvails (m1, e1) (m2, e2)
- = (plusFM_C (++) m1 m2, plusUFM_C plusAvail e1 e2)
-\end{code}
-
-
-=============== AvailInfo ================