[project @ 2000-10-25 07:09:52 by simonpj]
[ghc-hetmet.git] / ghc / compiler / main / HscTypes.lhs
index 1b34ec0..99b07b8 100644 (file)
@@ -10,7 +10,7 @@ module HscTypes (
        ModDetails(..), ModIface(..), GlobalSymbolTable, 
        HomeSymbolTable, PackageSymbolTable,
        HomeIfaceTable, PackageIfaceTable, 
-       lookupTable,
+       lookupTable, lookupTableByModName,
 
        IfaceDecls(..), 
 
@@ -30,6 +30,7 @@ module HscTypes (
        Deprecations(..), lookupDeprec,
 
        InstEnv, ClsInstEnv, DFunId,
+       PackageInstEnv, PackageRuleBase,
 
        GlobalRdrEnv, RdrAvailInfo,
 
@@ -49,7 +50,9 @@ import Name           ( Name, NameEnv, NamedThing,
 import NameSet         ( NameSet )
 import OccName         ( OccName )
 import Module          ( Module, ModuleName, ModuleEnv,
-                         lookupModuleEnv )
+                         lookupModuleEnv, lookupModuleEnvByName
+                       )
+import Rules           ( RuleBase )
 import VarSet          ( TyVarSet )
 import VarEnv          ( emptyVarEnv )
 import Id              ( Id )
@@ -59,8 +62,8 @@ import TyCon          ( TyCon )
 import BasicTypes      ( Version, initialVersion, Fixity )
 
 import HsSyn           ( DeprecTxt )
-import RdrHsSyn                ( RdrNameHsDecl )
-import RnHsSyn         ( RenamedTyClDecl, RenamedIfaceSig, RenamedRuleDecl, RenamedInstDecl )
+import RdrHsSyn                ( RdrNameHsDecl, RdrNameTyClDecl )
+import RnHsSyn         ( RenamedTyClDecl, RenamedRuleDecl, RenamedInstDecl )
 
 import CoreSyn         ( CoreRule )
 import Type            ( Type )
@@ -72,6 +75,7 @@ import UniqFM                 ( UniqFM )
 import Outputable
 import SrcLoc          ( SrcLoc, isGoodSrcLoc )
 import Util            ( thenCmp )
+import UniqSupply      ( UniqSupply )
 \end{code}
 
 %************************************************************************
@@ -136,7 +140,6 @@ data ModIface
      }
 
 data IfaceDecls = IfaceDecls { dcl_tycl  :: [RenamedTyClDecl], -- Sorted
-                              dcl_sigs  :: [RenamedIfaceSig],  -- Sorted
                               dcl_rules :: [RenamedRuleDecl],  -- Sorted
                               dcl_insts :: [RenamedInstDecl] } -- Unsorted
 
@@ -147,7 +150,7 @@ data ModDetails
        -- The next three fields are created by the typechecker
         md_types    :: TypeEnv,
         md_insts    :: [DFunId],       -- Dfun-ids for the instances in this module
-        md_rules    :: RuleEnv         -- Domain may include Ids from other modules
+        md_rules    :: [(Id,CoreRule)] -- Domain may include Ids from other modules
      }
 \end{code}
 
@@ -156,7 +159,7 @@ emptyModDetails :: ModDetails
 emptyModDetails
   = ModDetails { md_types = emptyTypeEnv,
                  md_insts = [],
-                 md_rules = emptyRuleEnv
+                 md_rules = []
     }
 
 emptyModIface :: Module -> ModIface
@@ -191,6 +194,11 @@ lookupTable ht pt name
   = lookupModuleEnv ht mod `seqMaybe` lookupModuleEnv pt mod
   where
     mod = nameModule name
+
+lookupTableByModName :: ModuleEnv a -> ModuleEnv a -> ModuleName -> Maybe a
+-- We often have two Symbol- or IfaceTables, and want to do a lookup
+lookupTableByModName ht pt mod
+  = lookupModuleEnvByName ht mod `seqMaybe` lookupModuleEnvByName pt mod
 \end{code}
 
 
@@ -293,12 +301,9 @@ lookupDeprec iface name
        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    = NameEnv [CoreRule]
-
-emptyRuleEnv    = emptyVarEnv
 \end{code}
 
 
@@ -375,14 +380,18 @@ data PersistentCompilerState
    = PCS {
         pcs_PIT :: PackageIfaceTable,  -- Domain = non-home-package modules
                                        --   the mi_decls component is empty
+
         pcs_PST :: PackageSymbolTable, -- Domain = non-home-package modules
                                        --   except that the InstEnv components is empty
-       pcs_insts :: InstEnv,           -- The total InstEnv accumulated from all
+
+       pcs_insts :: PackageInstEnv,    -- The total InstEnv accumulated from all
                                        --   the non-home-package modules
-       pcs_rules :: RuleEnv,           -- Ditto RuleEnv
+
+       pcs_rules :: PackageRuleBase,   -- Ditto RuleEnv
 
         pcs_PRS :: PersistentRenamerState
      }
+
 \end{code}
 
 The @PersistentRenamerState@ persists across successive calls to the
@@ -405,11 +414,15 @@ It contains:
     interface files but not yet sucked in, renamed, and typechecked
 
 \begin{code}
+type PackageRuleBase = RuleBase
+type PackageInstEnv  = InstEnv
+
 data PersistentRenamerState
   = PRS { prsOrig  :: OrigNameEnv,
          prsDecls :: DeclsMap,
          prsInsts :: IfaceInsts,
-         prsRules :: IfaceRules
+         prsRules :: IfaceRules,
+         prsNS    :: UniqSupply
     }
 \end{code}
 
@@ -443,7 +456,7 @@ including the constructors of a type decl etc.  The Bool is True just
 for the 'main' Name.
 
 \begin{code}
-type DeclsMap = NameEnv (AvailInfo, Bool, (Module, RdrNameHsDecl))
+type DeclsMap = NameEnv (AvailInfo, Bool, (Module, RdrNameTyClDecl))
 
 type IfaceInsts = Bag GatedDecl
 type IfaceRules = Bag GatedDecl