Module header tidyup, phase 1
[ghc-hetmet.git] / compiler / typecheck / TcType.lhs
index a382808..cb1c68b 100644 (file)
@@ -1,4 +1,4 @@
-
+%
 % (c) The GRASP/AQUA Project, Glasgow University, 1992-1998
 %
 \section[TcType]{Types used in the typechecker}
@@ -10,7 +10,7 @@ compiler.  These parts
                newtypes, and predicates are meaningful. 
        * look through usage types
 
-The "tc" prefix is for "typechechecker", because the type checker
+The "tc" prefix is for "TypeChecker", because the type checker
 is the principal client.
 
 \begin{code}
@@ -68,7 +68,7 @@ module TcType (
   isClassPred, isTyVarClassPred, isEqPred, 
   mkDictTy, tcSplitPredTy_maybe, 
   isPredTy, isDictTy, tcSplitDFunTy, tcSplitDFunHead, predTyUnique, 
-  mkClassPred, isInheritablePred, isLinearPred, isIPPred, mkPredName, 
+  mkClassPred, isInheritablePred, isIPPred, mkPredName, 
   dataConsStupidTheta, isRefineableTy,
 
   ---------------------------------
@@ -131,45 +131,9 @@ module TcType (
 -- friends:
 import TypeRep         ( Type(..), funTyCon, Kind )  -- friend
 
-import Type            (       -- Re-exports
-                         tyVarsOfType, tyVarsOfTypes, tyVarsOfPred,
-                         tyVarsOfTheta, Kind, PredType(..), KindVar,
-                         ThetaType, isUnliftedTypeKind, unliftedTypeKind, 
-                         argTypeKind,
-                         liftedTypeKind, openTypeKind, mkArrowKind,
-                         tySuperKind, isLiftedTypeKind,
-                         mkArrowKinds, mkForAllTy, mkForAllTys,
-                         defaultKind, isSubArgTypeKind, isSubOpenTypeKind,
-                         mkFunTy, mkFunTys, zipFunTys, 
-                         mkTyConApp, mkAppTy,
-                         mkAppTys, applyTy, applyTys,
-                         mkTyVarTy, mkTyVarTys, mkTyConTy, mkPredTy,
-                         mkPredTys, isUnLiftedType, 
-                         isUnboxedTupleType, isPrimitiveType,
-                         splitTyConApp_maybe,
-                         tidyTopType, tidyType, tidyPred, tidyTypes,
-                         tidyFreeTyVars, tidyOpenType, tidyOpenTypes,
-                         tidyTyVarBndr, tidyOpenTyVar,
-                         tidyOpenTyVars, tidyKind,
-                         isSubKind, tcView,
-
-                         tcEqType, tcEqTypes, tcCmpType, tcCmpTypes, 
-                         tcEqPred, tcCmpPred, tcEqTypeX, eqKind,
-
-                         TvSubst(..),
-                         TvSubstEnv, emptyTvSubst, mkTvSubst, zipTyEnv,
-                         mkOpenTvSubst, zipOpenTvSubst, zipTopTvSubst, mkTopTvSubst,
-                         getTvSubstEnv, setTvSubstEnv, getTvInScope, extendTvInScope,
-                         extendTvSubst, extendTvSubstList, isInScope, notElemTvSubst,
-                         substTy, substTys, substTyWith, substTheta, 
-                         substTyVar, substTyVarBndr, substPred, lookupTyVar,
-
-                         typeKind, repType, coreView, repSplitAppTy_maybe,
-                         pprKind, pprParendKind,
-                         pprType, pprParendType, pprTyThingCategory,
-                         pprPred, pprTheta, pprThetaArrow, pprClassPred
-                       )
-import TyCon           ( TyCon, isUnLiftedTyCon, isSynTyCon, synTyConDefn, tyConUnique )
+import Type
+import TyCon           ( TyCon, isUnLiftedTyCon, isSynTyCon, isOpenTyCon,
+                         synTyConDefn, tyConUnique )    
 import DataCon         ( DataCon, dataConStupidTheta, dataConResTys )
 import Class           ( Class )
 import Var             ( TyVar, Id, isCoVar, isTcTyVar, mkTcTyVar, tyVarName, tyVarKind, tcTyVarDetails )
@@ -185,14 +149,15 @@ import VarEnv             ( TidyEnv )
 import OccName         ( OccName, mkDictOcc, mkOccName, tvName )
 import PrelNames       -- Lots (e.g. in isFFIArgumentTy)
 import TysWiredIn      ( unitTyCon, charTyCon, listTyCon )
-import BasicTypes      ( IPName(..), Arity, ipNameName )
+import BasicTypes      ( Arity, ipNameName )
 import SrcLoc          ( SrcLoc, SrcSpan )
 import Util            ( equalLength )
 import Maybes          ( maybeToBool, expectJust, mapCatMaybes )
 import ListSetOps      ( hasNoDups )
 import List            ( nubBy )
 import Outputable
-import DATA_IOREF
+
+import Data.IORef
 \end{code}
 
 
@@ -343,6 +308,7 @@ data SkolemInfo
        -- The rest are for non-scoped skolems
   | ClsSkol Class      -- Bound at a class decl
   | InstSkol Id                -- Bound at an instance decl
+  | FamInstSkol TyCon  -- Bound at a family instance decl
   | PatSkol DataCon    -- An existential type variable bound by a pattern for
            SrcSpan     -- a data constructor with an existential type. E.g.
                        --      data T = forall a. Eq a => MkT a
@@ -397,6 +363,7 @@ mkKindName unique = mkSystemName unique kind_var_occ
 
 kindVarRef :: KindVar -> IORef MetaDetails
 kindVarRef tc = 
+  ASSERT ( isTcTyVar tc )
   case tcTyVarDetails tc of
     MetaTv TauTv ref -> ref
     other            -> pprPanic "kindVarRef" (ppr tc)
@@ -470,7 +437,8 @@ pprSkolTvBinding :: TcTyVar -> SDoc
 -- Print info about the binding of a skolem tyvar, 
 -- or nothing if we don't have anything useful to say
 pprSkolTvBinding tv
-  = ppr_details (tcTyVarDetails tv)
+  = ASSERT ( isTcTyVar tv )
+    ppr_details (tcTyVarDetails tv)
   where
     ppr_details (MetaTv TauTv _)   = quotes (ppr tv) <+> ptext SLIT("is a meta type variable")
     ppr_details (MetaTv BoxTv _)   = quotes (ppr tv) <+> ptext SLIT("is a boxy type variable")
@@ -485,8 +453,13 @@ pprSkolTvBinding tv
 pprSkolInfo :: SkolemInfo -> SDoc
 pprSkolInfo (SigSkol ctxt)   = ptext SLIT("is bound by") <+> pprUserTypeCtxt ctxt
 pprSkolInfo (ClsSkol cls)    = ptext SLIT("is bound by the class declaration for") <+> quotes (ppr cls)
-pprSkolInfo (InstSkol df)    = ptext SLIT("is bound by the instance declaration at") <+> ppr (getSrcLoc df)
-pprSkolInfo (ArrowSkol loc)  = ptext SLIT("is bound by the arrow form at") <+> ppr loc
+pprSkolInfo (InstSkol df)    = 
+  ptext SLIT("is bound by the instance declaration at") <+> ppr (getSrcLoc df)
+pprSkolInfo (FamInstSkol tc) = 
+  ptext SLIT("is bound by the family instance declaration at") <+> 
+  ppr (getSrcLoc tc)
+pprSkolInfo (ArrowSkol loc)  = 
+  ptext SLIT("is bound by the arrow form at") <+> ppr loc
 pprSkolInfo (PatSkol dc loc) = sep [ptext SLIT("is bound by the pattern for") <+> quotes (ppr dc),
                                    nest 2 (ptext SLIT("at") <+> ppr loc)]
 pprSkolInfo (GenSkol tvs ty loc) = sep [sep [ptext SLIT("is bound by the polymorphic type"), 
@@ -591,8 +564,9 @@ isTauTy other                 = False
 
 isTauTyCon :: TyCon -> Bool
 -- Returns False for type synonyms whose expansion is a polytype
-isTauTyCon tc | isSynTyCon tc = isTauTy (snd (synTyConDefn tc))
-             | otherwise     = True
+isTauTyCon tc 
+  | isSynTyCon tc && not (isOpenTyCon tc) = isTauTy (snd (synTyConDefn tc))
+  | otherwise                             = True
 
 ---------------
 isBoxyTy :: TcType -> Bool
@@ -688,10 +662,14 @@ tcMultiSplitSigmaTy sigma
 
 -----------------------
 tcTyConAppTyCon :: Type -> TyCon
-tcTyConAppTyCon ty = fst (tcSplitTyConApp ty)
+tcTyConAppTyCon ty = case tcSplitTyConApp_maybe ty of
+                       Just (tc, _) -> tc
+                       Nothing      -> pprPanic "tcTyConAppTyCon" (pprType ty)
 
 tcTyConAppArgs :: Type -> [Type]
-tcTyConAppArgs ty = snd (tcSplitTyConApp ty)
+tcTyConAppArgs ty = case tcSplitTyConApp_maybe ty of
+                       Just (_, args) -> args
+                       Nothing        -> pprPanic "tcTyConAppArgs" (pprType ty)
 
 tcSplitTyConApp :: Type -> (TyCon, [Type])
 tcSplitTyConApp ty = case tcSplitTyConApp_maybe ty of
@@ -850,10 +828,6 @@ getClassPredTys :: PredType -> (Class, [Type])
 getClassPredTys (ClassP clas tys) = (clas, tys)
 getClassPredTys other = panic "getClassPredTys"
 
-isEqPred :: PredType -> Bool
-isEqPred (EqPred {}) = True
-isEqPred _          = False
-
 mkDictTy :: Class -> [Type] -> Type
 mkDictTy clas tys = mkPredTy (ClassP clas tys)
 
@@ -881,10 +855,6 @@ isInheritablePred :: PredType -> Bool
 -- which can be free in g's rhs, and shared by both calls to g
 isInheritablePred (ClassP _ _) = True
 isInheritablePred other             = False
-
-isLinearPred :: TcPredType -> Bool
-isLinearPred (IParam (Linear n) _) = True
-isLinearPred other                = False
 \end{code}
 
 --------------------- Equality predicates ---------------------------------