[project @ 2005-04-04 11:55:11 by simonpj]
[ghc-hetmet.git] / ghc / compiler / typecheck / TcRnTypes.lhs
index ed1fb86..f9f9275 100644 (file)
@@ -9,7 +9,7 @@ module TcRnTypes(
        -- The environment types
        Env(..), 
        TcGblEnv(..), TcLclEnv(..), 
-       IfGblEnv(..), IfLclEnv(..),
+       IfGblEnv(..), IfLclEnv(..), 
 
        -- Ranamer types
        ErrCtxt,
@@ -20,7 +20,7 @@ module TcRnTypes(
        WhereFrom(..), mkModDeps,
 
        -- Typechecker types
-       TcTyThing(..), GadtRefinement,
+       TcTyThing(..), pprTcTyThingCategory, GadtRefinement,
 
        -- Template Haskell
        ThStage(..), topStage, topSpliceStage,
@@ -45,12 +45,12 @@ import HsSyn                ( PendingSplice, HsOverLit, LRuleDecl, LForeignDecl,
                          ArithSeqInfo, DictBinds, LHsBinds )
 import HscTypes                ( FixityEnv,
                          HscEnv, TypeEnv, TyThing, 
-                         GenAvailInfo(..), AvailInfo,
+                         GenAvailInfo(..), AvailInfo, HscSource(..),
                          availName, IsBootInterface, Deprecations )
 import Packages                ( PackageId )
-import Type            ( Type, TvSubstEnv, pprParendType )
+import Type            ( Type, TvSubstEnv, pprParendType, pprTyThingCategory )
 import TcType          ( TcTyVarSet, TcType, TcTauType, TcThetaType, SkolemInfo,
-                         TcPredType, TcKind, tcCmpPred, tcCmpType, tcCmpTypes )
+                         TcPredType, TcKind, tcCmpPred, tcCmpType, tcCmpTypes, pprSkolInfo )
 import InstEnv         ( DFunId, InstEnv )
 import IOEnv
 import RdrName         ( GlobalRdrEnv, LocalRdrEnv )
@@ -129,6 +129,9 @@ data Env gbl lcl    -- Changes as we move into an expression
 data TcGblEnv
   = TcGblEnv {
        tcg_mod     :: Module,          -- Module being compiled
+       tcg_src     :: HscSource,       -- What kind of module 
+                                       -- (regular Haskell, hs-boot, ext-core)
+
        tcg_rdr_env :: GlobalRdrEnv,    -- Top level envt; used during renaming
        tcg_default :: Maybe [Type],    -- Types used for defaulting
                                        -- Nothing => no 'default' decl
@@ -232,6 +235,13 @@ data IfLclEnv
        -- it means M.f = \x -> x, where M is the if_mod
        if_mod :: Module,
 
+       -- The field is used only for error reporting
+       -- if (say) there's a Lint error in it
+       if_loc :: SDoc,
+               -- Where the interface came from:
+               --      .hi file, or GHCi state, or ext core
+               -- plus which bit is currently being examined
+
        if_tv_env  :: OccEnv TyVar,     -- Nested tyvar bindings
        if_id_env  :: OccEnv Id         -- Nested id binding
     }
@@ -351,7 +361,8 @@ topSpliceStage = Splice (topLevel - 1)      -- Stage for the body of a top-level spli
 ---------------------------
 
 -- In arrow notation, a variable bound by a proc (or enclosed let/kappa)
--- is not in scope to the left of an arrow tail (-<).  For example
+-- is not in scope to the left of an arrow tail (-<) or the head of (|..|).
+-- For example
 --
 --     proc x -> (e1 -< e2)
 --
@@ -359,7 +370,7 @@ topSpliceStage = Splice (topLevel - 1)      -- Stage for the body of a top-level spli
 -- a bit complicated:
 --
 --     let x = 3 in
---     prox y -> (proc z -> e1) -< e2
+--     proc y -> (proc z -> e1) -< e2
 --
 -- Here, x and z are in scope in e1, but y is not.  Here's how we track this:
 --     a) Assign an "proc level" to each proc, being the number of
@@ -368,7 +379,8 @@ topSpliceStage = Splice (topLevel - 1)      -- Stage for the body of a top-level spli
 --        enclosing proc.
 --     c) Keep a list of out-of-scope procs.  When moving to the left of
 --        an arrow-tail, add the proc-level of the immediately enclosing
---        proc to the list.
+--        proc to the list, and increment the proc-level so that variables
+--        bound inside the expression are in scope.
 --     d) When looking up a variable, complain if its proc-level is in
 --        the banned list
 
@@ -389,7 +401,7 @@ data TcTyThing
 
   | ATcId   TcId ThLevel ProcLevel     -- Ids defined in this module; may not be fully zonked
 
-  | ATyVar  TyVar TcType               -- Type variables; tv -> type.  It can't just be a TyVar
+  | ATyVar  Name TcType                        -- Type variables; tv -> type.  It can't just be a TyVar
                                        -- that is mutated to point to the type it is bound to,
                                        -- because that would make it a wobbly type, and we
                                        -- want pattern-bound lexically-scoped type variables to
@@ -399,10 +411,17 @@ data TcTyThing
                                        --      tycons and clases in this recursive group
 
 instance Outputable TcTyThing where    -- Debugging only
-   ppr (AGlobal g)      = text "AGlobal" <+> ppr g
-   ppr (ATcId g tl pl)  = text "ATcId" <+> ppr g <+> ppr tl <+> ppr pl
-   ppr (ATyVar tv ty)   = text "ATyVar" <+> ppr tv <+> pprParendType ty
+   ppr (AGlobal g)      = ppr g
+   ppr (ATcId g tl pl)  = text "Identifier" <> 
+                         ifPprDebug (brackets (ppr g <> comma <> ppr tl <> comma <> ppr pl))
+   ppr (ATyVar tv ty)   = text "Type variable" <+> quotes (ppr tv) <+> pprParendType ty
    ppr (AThing k)       = text "AThing" <+> ppr k
+
+pprTcTyThingCategory :: TcTyThing -> SDoc
+pprTcTyThingCategory (AGlobal thing) = pprTyThingCategory thing
+pprTcTyThingCategory (ATyVar _ _)    = ptext SLIT("Type variable")
+pprTcTyThingCategory (ATcId _ _ _)   = ptext SLIT("Local identifier")
+pprTcTyThingCategory (AThing _)             = ptext SLIT("Kinded thing")
 \end{code}
 
 \begin{code}
@@ -653,10 +672,11 @@ data Inst
 
   | LitInst
        Name
-       HsOverLit       -- The literal from the occurrence site
-                       --      INVARIANT: never a rebindable-syntax literal
-                       --      Reason: tcSyntaxName does unification, and we
-                       --              don't want to deal with that during tcSimplify
+       (HsOverLit Name)        -- The literal from the occurrence site
+                               -- INVARIANT: never a rebindable-syntax literal
+                               -- Reason: tcSyntaxName does unification, and we
+                               --         don't want to deal with that during tcSimplify,
+                               --         when resolving LitInsts
        TcType          -- The type at which the literal is used
        InstLoc
 \end{code}
@@ -744,7 +764,7 @@ data InstOrigin
 
   | IPOccOrigin  (IPName Name) -- Occurrence of an implicit parameter
 
-  | LiteralOrigin HsOverLit    -- Occurrence of a literal
+  | LiteralOrigin (HsOverLit Name)     -- Occurrence of a literal
 
   | ArithSeqOrigin (ArithSeqInfo Name) -- [x..], [x..y] etc
   | PArrSeqOrigin  (ArithSeqInfo Name) -- [:x..y:] and [:x,y..z:]
@@ -762,8 +782,6 @@ data InstOrigin
 
 \begin{code}
 pprInstLoc :: InstLoc -> SDoc
-pprInstLoc (InstLoc (SigOrigin info) locn _) 
-  = text "arising from" <+> ppr info   -- I don't think this happens much, if at all
 pprInstLoc (InstLoc orig locn _)
   = hsep [text "arising from", pp_orig orig, text "at", ppr locn]
   where
@@ -774,11 +792,11 @@ pprInstLoc (InstLoc orig locn _)
     pp_orig (LiteralOrigin lit)         = hsep [ptext SLIT("the literal"), quotes (ppr lit)]
     pp_orig (ArithSeqOrigin seq) = hsep [ptext SLIT("the arithmetic sequence"), quotes (ppr seq)]
     pp_orig (PArrSeqOrigin seq)         = hsep [ptext SLIT("the parallel array sequence"), quotes (ppr seq)]
-    pp_orig InstSigOrigin       =  ptext SLIT("instantiating a type signature")
-    pp_orig InstScOrigin        =  ptext SLIT("the superclasses of an instance declaration")
+    pp_orig InstSigOrigin       = ptext SLIT("instantiating a type signature")
+    pp_orig InstScOrigin        = ptext SLIT("the superclasses of an instance declaration")
     pp_orig DerivOrigin                 = ptext SLIT("the 'deriving' clause of a data type declaration")
     pp_orig DefaultOrigin       = ptext SLIT("a 'default' declaration")
-    pp_orig DoOrigin            =  ptext SLIT("a do statement")
-    pp_orig ProcOrigin          =  ptext SLIT("a proc expression")
-    pp_orig (SigOrigin info)    = ppr info
+    pp_orig DoOrigin            = ptext SLIT("a do statement")
+    pp_orig ProcOrigin          = ptext SLIT("a proc expression")
+    pp_orig (SigOrigin info)    = pprSkolInfo info
 \end{code}