[project @ 2001-01-25 17:09:46 by simonpj]
[ghc-hetmet.git] / ghc / compiler / basicTypes / Module.lhs
index 96b50b7..7a2aa1b 100644 (file)
@@ -21,10 +21,10 @@ in a different DLL, by setting the DLL flag.
 \begin{code}
 module Module 
     (
-      Module, moduleName
+      Module, moduleName, packageOfModule,
                            -- abstract, instance of Eq, Ord, Outputable
     , ModuleName
-    , isModuleInThisPackage
+    , printModulePrefix
 
     , moduleNameString         -- :: ModuleName -> EncodedString
     , moduleNameUserString     -- :: ModuleName -> UserString
@@ -32,14 +32,12 @@ module Module
 
     , moduleString             -- :: Module -> EncodedString
     , moduleUserString         -- :: Module -> UserString
-    , moduleName               -- :: Module -> ModuleName
 
-    , mkVanillaModule      -- :: ModuleName -> Module
---    , mkThisModule       -- :: ModuleName -> Module
+    , mkVanillaModule          -- :: ModuleName -> Module
     , mkPrelModule             -- :: UserString -> Module
-    , mkModule                 -- :: ModuleName -> ModuleKind -> Module
-
---    , mkSrcModule
+    , mkModule                 -- :: ModuleName -> PackageName -> Module
+    , mkHomeModule             -- :: ModuleName -> Module
+    , isHomeModule             -- :: Module -> Bool
 
     , mkModuleName             -- :: UserString -> ModuleName
     , mkModuleNameFS           -- :: UserFS    -> ModuleName
@@ -56,7 +54,10 @@ module Module
     , elemModuleEnv, extendModuleEnv, extendModuleEnvList, plusModuleEnv_C
     , delModuleEnvList, delModuleEnv, plusModuleEnv, lookupModuleEnv
     , lookupWithDefaultModuleEnv, mapModuleEnv, mkModuleEnv, emptyModuleEnv
-    , rngModuleEnv, unitModuleEnv, isEmptyModuleEnv, foldModuleEnv
+    , moduleEnvElts, unitModuleEnv, isEmptyModuleEnv, foldModuleEnv
+    , lookupModuleEnvByName, extendModuleEnv_C
+
+    , ModuleSet, emptyModuleSet, mkModuleSet, moduleSetElts, extendModuleSet, elemModuleSet
 
     ) where
 
@@ -67,6 +68,7 @@ import CmdLineOpts    ( opt_InPackage )
 import FastString      ( FastString, uniqueOfFS )
 import Unique          ( Uniquable(..), mkUniqueGrimily )
 import UniqFM
+import UniqSet
 \end{code}
 
 
@@ -97,6 +99,12 @@ data PackageInfo
                                        -- as the one being compiled
   | AnotherPackage PackageName         -- A module from a different package
 
+  | DunnoYet   -- This is used when we don't yet know
+               -- Main case: we've come across Foo.x in an interface file
+               -- but we havn't yet opened Foo.hi.  We need a Name for Foo.x
+               -- Later on (in RnEnv.newTopBinder) we'll update the cache
+               -- to have the right PackageInfo
+
 type PackageName = FastString          -- No encoding at all
 
 preludePackage :: PackageName
@@ -105,6 +113,7 @@ preludePackage = SLIT("std")
 instance Outputable PackageInfo where
        -- Just used in debug prints of lex tokens and in debug modde
    ppr ThisPackage        = ptext SLIT("<THIS>")
+   ppr DunnoYet                  = ptext SLIT("<?>")
    ppr (AnotherPackage p) = ptext p
 \end{code}
 
@@ -223,12 +232,18 @@ mkModule mod_nm pack_name
     pack_info | pack_name == opt_InPackage = ThisPackage
              | otherwise                  = AnotherPackage pack_name
 
+mkHomeModule :: ModuleName -> Module
+mkHomeModule mod_nm = Module mod_nm ThisPackage
+
+isHomeModule :: Module -> Bool
+isHomeModule (Module nm ThisPackage) = True
+isHomeModule _                       = False
 
 -- Used temporarily when we first come across Foo.x in an interface
 -- file, but before we've opened Foo.hi.
 -- (Until we've opened Foo.hi we don't know what the PackageInfo is.)
 mkVanillaModule :: ModuleName -> Module
-mkVanillaModule name = mkModule name (panic "mkVanillaModule:unknown mod_kind field")
+mkVanillaModule name = Module name DunnoYet
 
 mkPrelModule :: ModuleName -> Module
 mkPrelModule name = mkModule name preludePackage
@@ -237,16 +252,22 @@ moduleString :: Module -> EncodedString
 moduleString (Module (ModuleName fs) _) = _UNPK_ fs
 
 moduleName :: Module -> ModuleName
-moduleName (Module mod _) = mod
+moduleName (Module mod pkg_info) = mod
 
 moduleUserString :: Module -> UserString
 moduleUserString (Module mod _) = moduleNameUserString mod
 
-isModuleInThisPackage :: Module -> Bool
-isModuleInThisPackage (Module nm ThisPackage) = True
-isModuleInThisPackage _                       = False
+packageOfModule :: Module -> Maybe PackageName
+packageOfModule (Module nm (AnotherPackage pn)) = Just pn
+packageOfModule _                               = Nothing
+
+printModulePrefix :: Module -> Bool
+  -- When printing, say M.x
+printModulePrefix (Module nm ThisPackage) = False
+printModulePrefix _                       = True
 \end{code}
 
+
 %************************************************************************
 %*                                                                      *
 \subsection{@ModuleEnv@s}
@@ -260,6 +281,7 @@ emptyModuleEnv       :: ModuleEnv a
 mkModuleEnv          :: [(Module, a)] -> ModuleEnv a
 unitModuleEnv        :: Module -> a -> ModuleEnv a
 extendModuleEnv      :: ModuleEnv a -> Module -> a -> ModuleEnv a
+extendModuleEnv_C    :: (a->a->a) -> ModuleEnv a -> Module -> a -> ModuleEnv a
 plusModuleEnv        :: ModuleEnv a -> ModuleEnv a -> ModuleEnv a
 extendModuleEnvList  :: ModuleEnv a -> [(Module, a)] -> ModuleEnv a
                   
@@ -267,28 +289,47 @@ delModuleEnvList     :: ModuleEnv a -> [Module] -> ModuleEnv a
 delModuleEnv         :: ModuleEnv a -> Module -> ModuleEnv a
 plusModuleEnv_C      :: (a -> a -> a) -> ModuleEnv a -> ModuleEnv a -> ModuleEnv a
 mapModuleEnv         :: (a -> b) -> ModuleEnv a -> ModuleEnv b
-rngModuleEnv         :: ModuleEnv a -> [a]
+moduleEnvElts        :: ModuleEnv a -> [a]
                   
 isEmptyModuleEnv     :: ModuleEnv a -> Bool
-lookupModuleEnv      :: ModuleEnv a -> Module -> Maybe a
+lookupModuleEnv      :: ModuleEnv a -> Module     -> Maybe a
+lookupModuleEnvByName:: ModuleEnv a -> ModuleName -> Maybe a
 lookupWithDefaultModuleEnv :: ModuleEnv a -> a -> Module -> a
 elemModuleEnv        :: Module -> ModuleEnv a -> Bool
 foldModuleEnv        :: (a -> b -> b) -> b -> ModuleEnv a -> b
 
 elemModuleEnv       = elemUFM
 extendModuleEnv     = addToUFM
+extendModuleEnv_C   = addToUFM_C
 extendModuleEnvList = addListToUFM
 plusModuleEnv_C     = plusUFM_C
 delModuleEnvList    = delListFromUFM
 delModuleEnv        = delFromUFM
 plusModuleEnv       = plusUFM
 lookupModuleEnv     = lookupUFM
+lookupModuleEnvByName = lookupUFM
 lookupWithDefaultModuleEnv = lookupWithDefaultUFM
 mapModuleEnv        = mapUFM
 mkModuleEnv         = listToUFM
 emptyModuleEnv      = emptyUFM
-rngModuleEnv        = eltsUFM
+moduleEnvElts       = eltsUFM
 unitModuleEnv       = unitUFM
 isEmptyModuleEnv    = isNullUFM
 foldModuleEnv       = foldUFM
 \end{code}
+
+\begin{code}
+
+type ModuleSet = UniqSet Module
+mkModuleSet    :: [Module] -> ModuleSet
+extendModuleSet :: ModuleSet -> Module -> ModuleSet
+emptyModuleSet  :: ModuleSet
+moduleSetElts   :: ModuleSet -> [Module]
+elemModuleSet   :: Module -> ModuleSet -> Bool
+
+emptyModuleSet  = emptyUniqSet
+mkModuleSet     = mkUniqSet
+extendModuleSet = addOneToUniqSet
+moduleSetElts   = uniqSetToList
+elemModuleSet   = elementOfUniqSet
+\end{code}