Initial checkin of HetMet / -XModalTypes modifications
[ghc-hetmet.git] / compiler / typecheck / TcEnv.lhs
index 354e4b2..c6789f4 100644 (file)
@@ -29,6 +29,7 @@ module TcEnv(
        tcLookupId, tcLookupTyVar, getScopedTyVarBinds,
        getInLocalScope,
        wrongThingErr, pprBinders,
+        getHetMetLevel,
 
        tcExtendRecEnv,         -- For knot-tying
 
@@ -405,11 +406,19 @@ tcExtendIdEnv ids thing_inside = tcExtendIdEnv2 [(idName id, id) | id <- ids] th
 tcExtendIdEnv1 :: Name -> TcId -> TcM a -> TcM a
 tcExtendIdEnv1 name id thing_inside = tcExtendIdEnv2 [(name,id)] thing_inside
 
+getHetMetLevel :: TcM [TyVar]
+getHetMetLevel =
+    do { env <- getEnv
+       ; return $ case env of Env { env_lcl = e' } -> case e' of TcLclEnv { tcl_hetMetLevel = x } -> x
+       }
+
 tcExtendIdEnv2 :: [(Name,TcId)] -> TcM a -> TcM a
 -- Invariant: the TcIds are fully zonked (see tcExtendIdEnv above)
 tcExtendIdEnv2 names_w_ids thing_inside
   = do { env <- getLclEnv
-       ; tc_extend_local_id_env env (thLevel (tcl_th_ctxt env)) names_w_ids thing_inside }
+        ; hetMetLevel <- getHetMetLevel
+       ; tc_extend_local_id_env env (thLevel (tcl_th_ctxt env)) hetMetLevel names_w_ids thing_inside }
+
 
 tcExtendGhciEnv :: [TcId] -> TcM a -> TcM a
 -- Used to bind Ids for GHCi identifiers bound earlier in the user interaction
@@ -418,11 +427,13 @@ tcExtendGhciEnv :: [TcId] -> TcM a -> TcM a
 -- GHCi has already compiled it to bytecode
 tcExtendGhciEnv ids thing_inside
   = do { env <- getLclEnv
-       ; tc_extend_local_id_env env impLevel [(idName id, id) | id <- ids] thing_inside }
+        ; hetMetLevel <- getHetMetLevel
+       ; tc_extend_local_id_env env impLevel hetMetLevel [(idName id, id) | id <- ids] thing_inside }
 
 tc_extend_local_id_env         -- This is the guy who does the work
        :: TcLclEnv
        -> ThLevel
+       -> [TyVar]
        -> [(Name,TcId)]
        -> TcM a -> TcM a
 -- Invariant: the TcIds are fully zonked. Reasons:
@@ -432,7 +443,7 @@ tc_extend_local_id_env              -- This is the guy who does the work
 --         in the types, because instantiation does not look through such things
 --     (c) The call to tyVarsOfTypes is ok without looking through refs
 
-tc_extend_local_id_env env th_lvl names_w_ids thing_inside
+tc_extend_local_id_env env th_lvl hetMetLevel names_w_ids thing_inside
   = do { traceTc "env2" (ppr extra_env)
        ; gtvs' <- tcExtendGlobalTyVars (tcl_tyvars env) extra_global_tyvars
        ; let env' = env {tcl_env = le', tcl_tyvars = gtvs', tcl_rdr = rdr_env'}
@@ -440,7 +451,9 @@ tc_extend_local_id_env env th_lvl names_w_ids thing_inside
   where
     extra_global_tyvars = tcTyVarsOfTypes [idType id | (_,id) <- names_w_ids]
     extra_env      = [ (name, ATcId { tct_id = id, 
-                                      tct_level = th_lvl })
+                                      tct_level = th_lvl,
+                                      tct_hetMetLevel = hetMetLevel
+                                     })
                      | (name,id) <- names_w_ids]
     le'                    = extendNameEnvList (tcl_env env) extra_env
     rdr_env'       = extendLocalRdrEnvList (tcl_rdr env) [name | (name,_) <- names_w_ids]