[project @ 2000-10-24 08:40:09 by simonpj]
[ghc-hetmet.git] / ghc / compiler / main / HscTypes.lhs
index 09a42c9..1b34ec0 100644 (file)
@@ -9,23 +9,26 @@ module HscTypes (
 
        ModDetails(..), ModIface(..), GlobalSymbolTable, 
        HomeSymbolTable, PackageSymbolTable,
-       HomeIfaceTable, PackageIfaceTable,
+       HomeIfaceTable, PackageIfaceTable, 
+       lookupTable,
 
-       VersionInfo(..),
+       IfaceDecls(..), 
+
+       VersionInfo(..), initialVersionInfo,
 
        TyThing(..), groupTyThings,
 
        TypeEnv, extendTypeEnv, lookupTypeEnv, 
 
-       lookupFixityEnv,
-
        WhetherHasOrphans, ImportVersion, WhatsImported(..),
        PersistentRenamerState(..), IsBootInterface, Avails, DeclsMap,
-       IfaceInsts, IfaceRules, DeprecationEnv, GatedDecl,
+       IfaceInsts, IfaceRules, GatedDecl,
        OrigNameEnv(..), OrigNameNameEnv, OrigNameIParamEnv,
        AvailEnv, AvailInfo, GenAvailInfo(..),
        PersistentCompilerState(..),
 
+       Deprecations(..), lookupDeprec,
+
        InstEnv, ClsInstEnv, DFunId,
 
        GlobalRdrEnv, RdrAvailInfo,
@@ -48,22 +51,23 @@ import OccName              ( OccName )
 import Module          ( Module, ModuleName, ModuleEnv,
                          lookupModuleEnv )
 import VarSet          ( TyVarSet )
-import VarEnv          ( IdEnv, emptyVarEnv )
+import VarEnv          ( emptyVarEnv )
 import Id              ( Id )
 import Class           ( Class )
 import TyCon           ( TyCon )
 
-import BasicTypes      ( Version, Fixity )
+import BasicTypes      ( Version, initialVersion, Fixity )
 
 import HsSyn           ( DeprecTxt )
 import RdrHsSyn                ( RdrNameHsDecl )
-import RnHsSyn         ( RenamedHsDecl )
+import RnHsSyn         ( RenamedTyClDecl, RenamedIfaceSig, RenamedRuleDecl, RenamedInstDecl )
 
 import CoreSyn         ( CoreRule )
 import Type            ( Type )
 
 import FiniteMap       ( FiniteMap, emptyFM, addToFM, lookupFM, foldFM )
 import Bag             ( Bag )
+import Maybes          ( seqMaybe )
 import UniqFM          ( UniqFM )
 import Outputable
 import SrcLoc          ( SrcLoc, isGoodSrcLoc )
@@ -113,18 +117,29 @@ data ModIface
         mi_module   :: Module,                 -- Complete with package info
         mi_version  :: VersionInfo,            -- Module version number
         mi_orphan   :: WhetherHasOrphans,       -- Whether this module has orphans
-        mi_usages   :: [ImportVersion Name],   -- Usages
+
+        mi_usages   :: [ImportVersion Name],   -- Usages; kept sorted so that it's easy
+                                               -- to decide whether to write a new iface file
+                                               -- (changing usages doesn't affect the version of
+                                               --  this module)
 
         mi_exports  :: Avails,                 -- What it exports
+                                               -- Kept sorted by (mod,occ),
+                                               -- to make version comparisons easier
+
         mi_globals  :: GlobalRdrEnv,           -- Its top level environment
 
         mi_fixities :: NameEnv Fixity,         -- Fixities
-       mi_deprecs  :: NameEnv DeprecTxt,       -- Deprecations
+       mi_deprecs  :: Deprecations,            -- Deprecations
 
-       mi_decls    :: [RenamedHsDecl]          -- types, classes 
-                                               -- inst decls, rules, iface sigs
+       mi_decls    :: IfaceDecls               -- The RnDecls form of ModDetails
      }
 
+data IfaceDecls = IfaceDecls { dcl_tycl  :: [RenamedTyClDecl], -- Sorted
+                              dcl_sigs  :: [RenamedIfaceSig],  -- Sorted
+                              dcl_rules :: [RenamedRuleDecl],  -- Sorted
+                              dcl_insts :: [RenamedInstDecl] } -- Unsorted
+
 -- typechecker should only look at this, not ModIface
 -- Should be able to construct ModDetails from mi_decls in ModIface
 data ModDetails
@@ -149,7 +164,7 @@ emptyModIface mod
   = ModIface { mi_module   = mod,
               mi_exports  = [],
               mi_globals  = emptyRdrEnv,
-              mi_deprecs  = emptyNameEnv,
+              mi_deprecs  = NoDeprecs
     }          
 \end{code}
 
@@ -170,11 +185,12 @@ type GlobalSymbolTable  = SymbolTable     -- Domain = all modules
 Simple lookups in the symbol table.
 
 \begin{code}
-lookupFixityEnv :: IfaceTable -> Name -> Maybe Fixity
-lookupFixityEnv tbl name
-  = case lookupModuleEnv tbl (nameModule name) of
-       Nothing      -> Nothing
-       Just details -> lookupNameEnv (mi_fixities details) name
+lookupTable :: ModuleEnv a -> ModuleEnv a -> Name -> Maybe a
+-- We often have two Symbol- or IfaceTables, and want to do a lookup
+lookupTable ht pt name
+  = lookupModuleEnv ht mod `seqMaybe` lookupModuleEnv pt mod
+  where
+    mod = nameModule name
 \end{code}
 
 
@@ -258,13 +274,29 @@ data VersionInfo
                -- the parent class/tycon changes
     }
 
-type DeprecationEnv = NameEnv DeprecTxt                -- Give reason for deprecation
+initialVersionInfo :: VersionInfo
+initialVersionInfo = VersionInfo { vers_module  = initialVersion,
+                                  vers_exports = initialVersion,
+                                  vers_rules   = initialVersion,
+                                  vers_decls   = emptyNameEnv }
+
+data Deprecations = NoDeprecs
+                 | DeprecAll DeprecTxt                 -- Whole module deprecated
+                 | DeprecSome (NameEnv DeprecTxt)      -- Some things deprecated
+                                                       -- Just "big" names
+
+lookupDeprec :: ModIface -> Name -> Maybe DeprecTxt
+lookupDeprec iface name
+  = case mi_deprecs iface of
+       NoDeprecs      -> Nothing
+       DeprecAll txt  -> Just txt
+       DeprecSome env -> lookupNameEnv env name
 
 type InstEnv    = UniqFM ClsInstEnv            -- Maps Class to instances for that class
 type ClsInstEnv = [(TyVarSet, [Type], DFunId)] -- The instances for a particular class
 type DFunId    = Id
 
-type RuleEnv    = IdEnv [CoreRule]
+type RuleEnv    = NameEnv [CoreRule]
 
 emptyRuleEnv    = emptyVarEnv
 \end{code}
@@ -468,16 +500,6 @@ instance Ord ImportReason where
       = (m1 `compare` m2) `thenCmp` (loc1 `compare` loc2)
 
 
-{-
-Moved here from Name.
-pp_prov (LocalDef _ Exported)          = char 'x'
-pp_prov (LocalDef _ NotExported)       = char 'l'
-pp_prov (NonLocalDef ImplicitImport _) = char 'j'
-pp_prov (NonLocalDef (UserImport _ _ True ) _) = char 'I'      -- Imported by name
-pp_prov (NonLocalDef (UserImport _ _ False) _) = char 'i'      -- Imported by ..
-pp_prov SystemProv                    = char 's'
--}
-
 data ImportReason
   = UserImport Module SrcLoc Bool      -- Imported from module M on line L
                                        -- Note the M may well not be the defining module
@@ -510,7 +532,7 @@ hasBetterProv (NonLocalDef (UserImport _ _ _   ) _) (NonLocalDef ImplicitImport
 hasBetterProv _                                            _                              = False
 
 pprNameProvenance :: Name -> Provenance -> SDoc
-pprNameProvenance name LocalDef               = ptext SLIT("defined at") <+> ppr (nameSrcLoc name)
+pprNameProvenance name LocalDef           = ptext SLIT("defined at") <+> ppr (nameSrcLoc name)
 pprNameProvenance name (NonLocalDef why _) = sep [ppr_reason why, 
                                              nest 2 (parens (ppr_defn (nameSrcLoc name)))]