[project @ 2004-11-25 11:36:34 by simonpj]
[ghc-hetmet.git] / ghc / compiler / typecheck / TcRnTypes.lhs
index f563331..df7dc46 100644 (file)
@@ -111,14 +111,14 @@ type TcM  a = TcRn a              -- Historical
 data Env gbl lcl       -- Changes as we move into an expression
   = Env {
        env_top  :: HscEnv,     -- Top-level stuff that never changes
-                               --   Includes all info about imported things
+                               -- Includes all info about imported things
 
        env_us   :: TcRef UniqSupply,   -- Unique supply for local varibles
 
        env_gbl  :: gbl,        -- Info about things defined at the top level
-                               --   of the module being compiled
+                               -- of the module being compiled
 
-       env_lcl  :: lcl         -- Nested stuff -- changes as we go into 
+       env_lcl  :: lcl         -- Nested stuff; changes as we go into 
                                -- an expression
     }
 
@@ -150,21 +150,6 @@ data TcGblEnv
        
        tcg_inst_env :: InstEnv,        -- Instance envt for *home-package* modules
                                        -- Includes the dfuns in tcg_insts
-       tcg_inst_uses :: TcRef NameSet, -- Home-package Dfuns actually used 
-               -- Used to generate version dependencies
-               -- This records usages, rather like tcg_dus, but it has to
-               -- be a mutable variable so it can be augmented 
-               -- when we look up an instance.  These uses of dfuns are
-               -- rather like the free variables of the program, but
-               -- are implicit instead of explicit.
-
-       tcg_th_used :: TcRef Bool,      -- True <=> Template Haskell syntax used
-               -- We need this so that we can generate a dependency on the
-               -- Template Haskell package, becuase the desugarer is going to
-               -- emit loads of references to TH symbols.  It's rather like 
-               -- tcg_inst_uses; the reference is implicit rather than explicit,
-               -- so we have to zap a mutable variable.
-
                -- Now a bunch of things about this module that are simply 
                -- accumulated, but never consulted until the end.  
                -- Nevertheless, it's convenient to accumulate them along 
@@ -180,11 +165,33 @@ data TcGblEnv
                                --              things have not changed version stamp
                                --      (b) unused-import info
 
-       tcg_keep :: NameSet,    -- Set of names to keep alive, and to expose in the 
-                               -- interface file (but not to export to the user).
-                               -- These are typically extra definitions generated from
-                               -- data type declarations which would otherwise be
-                               -- dropped as dead code.  
+       tcg_keep :: TcRef NameSet,      -- Locally-defined top-level names to keep alive
+               -- "Keep alive" means give them an Exported flag, so
+               -- that the simplifier does not discard them as dead 
+               -- code, and so that they are exposed in the interface file
+               -- (but not to export to the user).
+               --
+               -- Some things, like dict-fun Ids and default-method Ids are 
+               -- "born" with the Exported flag on, for exactly the above reason,
+               -- but some we only discover as we go.  Specifically:
+               --      * The to/from functions for generic data types
+               --      * Top-level variables appearing free in the RHS of an orphan rule
+               --      * Top-level variables appearing free in a TH bracket
+
+       tcg_inst_uses :: TcRef NameSet, -- Home-package Dfuns actually used 
+               -- Used to generate version dependencies
+               -- This records usages, rather like tcg_dus, but it has to
+               -- be a mutable variable so it can be augmented 
+               -- when we look up an instance.  These uses of dfuns are
+               -- rather like the free variables of the program, but
+               -- are implicit instead of explicit.
+
+       tcg_th_used :: TcRef Bool,      -- True <=> Template Haskell syntax used
+               -- We need this so that we can generate a dependency on the
+               -- Template Haskell package, becuase the desugarer is going to
+               -- emit loads of references to TH symbols.  It's rather like 
+               -- tcg_inst_uses; the reference is implicit rather than explicit,
+               -- so we have to zap a mutable variable.
 
                -- The next fields accumulate the payload of the module
                -- The binds, rules and foreign-decl fiels are collected
@@ -278,24 +285,55 @@ data TcLclEnv             -- Changes as we move inside an expression
        tcl_env  :: NameEnv TcTyThing,  -- The local type environment: Ids and TyVars
                                        -- defined in this module
                                        
-       tcl_gadt :: GadtRefinement,     -- The current type refinement for GADTs
-
        tcl_tyvars :: TcRef TcTyVarSet, -- The "global tyvars"
-                       -- Namely, the in-scope TyVars bound in tcl_lenv, 
+                       -- Namely, the in-scope TyVars bound in tcl_env, 
                        -- plus the tyvars mentioned in the types of Ids bound in tcl_lenv
                        -- Why mutable? see notes with tcGetGlobalTyVars
 
-       tcl_lie :: TcRef LIE            -- Place to accumulate type constraints
+       tcl_lie   :: TcRef LIE,         -- Place to accumulate type constraints
+       tcl_gadt  :: GadtRefinement     -- The current type refinement for GADTs
+
+-----------------------------------------------------------
+-- Not yet; it's a new complication and I want to see whether it bites
+--     tcl_given :: [Inst]             -- Insts available in the current context (see Note [Given Insts])
+-----------------------------------------------------------
     }
 
 type GadtRefinement = TvSubstEnv       -- Binds rigid type variables to their refinements
 
+{- Note [Given Insts]
+   ~~~~~~~~~~~~~~~~~~
+Because of GADTs, we have to pass inwards the Insts provided by type signatures 
+and existential contexts. Consider
+       data T a where { T1 :: b -> b -> T [b] }
+       f :: Eq a => T a -> Bool
+       f (T1 x y) = [x]==[y]
+
+The constructor T1 binds an existential variable 'b', and we need Eq [b].
+Well, we have it, because Eq a refines to Eq [b], but we can only spot that if we 
+pass it inwards.
+
+-}
 
 ---------------------------
 -- Template Haskell levels 
 ---------------------------
 
-type ThLevel = Int     -- Always >= 0
+type ThLevel = Int     
+       -- Indicates how many levels of brackets we are inside
+       --      (always >= 0)
+       -- Incremented when going inside a bracket,
+       -- decremented when going inside a splice
+
+impLevel, topLevel :: ThLevel
+topLevel = 1   -- Things defined at top level of this module
+impLevel = 0   -- Imported things; they can be used inside a top level splice
+--
+-- For example: 
+--     f = ...
+--     g1 = $(map ...)         is OK
+--     g2 = $(f ...)           is not OK; because we havn't compiled f yet
+
 
 data ThStage
   = Comp                               -- Ordinary compiling, at level topLevel
@@ -308,16 +346,6 @@ topStage       = Comp
 topSpliceStage = Splice (topLevel - 1) -- Stage for the body of a top-level splice
 
 
-impLevel, topLevel :: ThLevel
-topLevel = 1   -- Things defined at top level of this module
-impLevel = 0   -- Imported things; they can be used inside a top level splice
---
--- For example: 
---     f = ...
---     g1 = $(map ...)         is OK
---     g2 = $(f ...)           is not OK; because we havn't compiled f yet
-
-
 ---------------------------
 -- Arrow-notation stages
 ---------------------------
@@ -616,7 +644,7 @@ type Int, represented by
 \begin{code}
 data Inst
   = Dict
-       Id
+       Name
        TcPredType
        InstLoc
 
@@ -651,7 +679,7 @@ data Inst
        --   This only bites in the call to tcInstClassOp in TcClassDcl.mkMethodBind
 
   | LitInst
-       Id
+       Name
        HsOverLit       -- The literal from the occurrence site
                        --      INVARIANT: never a rebindable-syntax literal
                        --      Reason: tcSyntaxName does unification, and we