Fix scoped type variables for expression type signatures
[ghc-hetmet.git] / compiler / basicTypes / Var.lhs
index e4aa8c2..017e355 100644 (file)
@@ -10,7 +10,7 @@ module Var (
        setVarName, setVarUnique, 
 
        -- TyVars
-       TyVar, mkTyVar, mkTcTyVar, mkWildTyVar,
+       TyVar, mkTyVar, mkTcTyVar, mkWildCoVar,
        tyVarName, tyVarKind,
        setTyVarName, setTyVarUnique, setTyVarKind,
        tcTyVarDetails,
@@ -22,7 +22,7 @@ module Var (
        Id, DictId,
        idName, idType, idUnique, idInfo, modifyIdInfo, maybeModifyIdInfo,
        setIdName, setIdUnique, setIdType, setIdInfo, lazySetIdInfo, 
-       setIdExported, setIdNotExported, 
+       setIdExported, setIdNotExported,
 
        globalIdDetails, globaliseId, 
 
@@ -40,12 +40,14 @@ import {-# SOURCE #-}       TcType( TcTyVarDetails, pprTcTyVarDetails )
 import {-# SOURCE #-}  IdInfo( GlobalIdDetails, notGlobalId, IdInfo, seqIdInfo )
 
 import Name            ( Name, NamedThing(..),
-                         setNameUnique, nameUnique, mkSysTvName
+                         setNameUnique, nameUnique, mkSysTvName, 
+                          mkSystemVarName
                        )
 import Unique          ( Unique, Uniquable(..), mkUniqueGrimily, getKey#,
                           mkBuiltinUnique )
 import FastTypes
-import Outputable
+import FastString
+import Outputable       
 \end{code}
 
 
@@ -68,7 +70,9 @@ data Var
        realUnique :: FastInt,          -- Key for fast comparison
                                        -- Identical to the Unique in the name,
                                        -- cached here for speed
-       tyVarKind :: Kind }
+       tyVarKind :: Kind,
+        isCoercionVar :: Bool
+ }
 
   | TcTyVar {                          -- Used only during type inference
                                        -- Used for kind variables during 
@@ -189,6 +193,7 @@ mkTyVar :: Name -> Kind -> TyVar
 mkTyVar name kind = TyVar { varName    = name
                          , realUnique = getKey# (nameUnique name)
                          , tyVarKind  = kind
+                          , isCoercionVar    = False
                        }
 
 mkTcTyVar :: Name -> Kind -> TcTyVarDetails -> TyVar
@@ -199,13 +204,16 @@ mkTcTyVar name kind details
                tcTyVarDetails = details
        }
 
-mkWildTyVar :: Kind -> TyVar
-mkWildTyVar kind 
+mkWildCoVar :: Kind -> TyVar
+-- A type variable that is never referred to,
+-- so its unique doesn't matter
+mkWildCoVar kind 
   = TyVar { varName = mkSysTvName wild_uniq FSLIT("co_wild"),
             realUnique = _ILIT(1),
-            tyVarKind = kind }
+            tyVarKind = kind,
+            isCoercionVar = True }
   where
-    wild_uniq = (mkBuiltinUnique 1)
+    wild_uniq = mkBuiltinUnique 1
 \end{code}
 
 %************************************************************************
@@ -223,10 +231,12 @@ setCoVarUnique = setVarUnique
 setCoVarName   = setVarName
 
 mkCoVar :: Name -> Kind -> CoVar
-mkCoVar name kind = mkTyVar name kind
+mkCoVar name kind = TyVar { varName    = name
+                         , realUnique = getKey# (nameUnique name)
+                         , tyVarKind  = kind
+                          , isCoercionVar    = True
+                       }
 
-isCoVar :: TyVar -> Bool
-isCoVar ty = isCoSuperKind (tyVarKind ty)
 \end{code}
 
 %************************************************************************
@@ -342,6 +352,9 @@ isId other     = False
 isLocalId (LocalId {}) = True
 isLocalId other               = False
 
+isCoVar (v@(TyVar {})) = isCoercionVar v
+isCoVar other          = False
+
 -- isLocalVar returns True for type variables as well as local Ids
 -- These are the variables that we need to pay attention to when finding free
 -- variables, or doing dependency analysis.