%
+% (c) The University of Glasgow 2006
% (c) The AQUA Project, Glasgow University, 1996-1998
%
-\section[TcTyClsDecls]{Typecheck type and class declarations}
+
+TcTyClsDecls: Typecheck type and class declarations
\begin{code}
module TcTyClsDecls (
#include "HsVersions.h"
-import HsSyn ( TyClDecl(..), HsConDetails(..), HsTyVarBndr(..),
- ConDecl(..), Sig(..), NewOrData(..), ResType(..),
- tyClDeclTyVars, isSynDecl, isIdxTyDecl,
- isKindSigDecl, hsConArgs, LTyClDecl, tcdName,
- hsTyVarName, LHsTyVarBndr, LHsType
- )
-import HsTypes ( HsBang(..), getBangStrictness, hsLTyVarNames )
-import BasicTypes ( RecFlag(..), StrictnessMark(..) )
-import HscTypes ( implicitTyThings, ModDetails )
-import BuildTyCl ( buildClass, buildAlgTyCon, buildSynTyCon, buildDataCon,
- mkDataTyConRhs, mkNewTyConRhs )
+import HsSyn
+import HsTypes
+import BasicTypes
+import HscTypes
+import BuildTyCl
import TcRnMonad
-import TcEnv ( TyThing(..),
- tcLookupLocated, tcLookupLocatedGlobal,
- tcExtendGlobalEnv, tcExtendKindEnv,
- tcExtendKindEnvTvs, newFamInstTyConName,
- tcExtendRecEnv, tcLookupTyVar, tcLookupLocatedTyCon )
-import TcTyDecls ( calcRecFlags, calcClassCycles, calcSynCycles )
-import TcClassDcl ( tcClassSigs, tcAddDeclCtxt )
-import TcHsType ( kcHsTyVars, kcHsLiftedSigType, kcHsType,
- kcHsContext, tcTyVarBndrs, tcHsKindedType, tcHsKindedContext,
- kcHsSigType, tcHsBangType, tcLHsConResTy,
- tcDataKindSig, kcCheckHsType )
-import TcMType ( newKindVar, checkValidTheta, checkValidType,
- -- checkFreeness,
- UserTypeCtxt(..), SourceTyCtxt(..) )
-import TcType ( TcKind, TcType, Type, tyVarsOfType, mkPhiTy,
- mkArrowKind, liftedTypeKind,
- tcSplitSigmaTy, tcGetTyVar_maybe )
-import Type ( splitTyConApp_maybe,
- newTyConInstRhs, isLiftedTypeKind, Kind,
- splitKindFunTys, mkArrowKinds
- -- pprParendType, pprThetaArrow
- )
-import Generics ( validGenericMethodType, canDoGenerics )
-import Class ( Class, className, classTyCon, DefMeth(..), classBigSig, classTyVars )
-import TyCon ( TyCon, AlgTyConRhs( AbstractTyCon, OpenDataTyCon,
- OpenNewTyCon ),
- SynTyConRhs( OpenSynTyCon, SynonymTyCon ),
- tyConDataCons, mkForeignTyCon, isProductTyCon,
- isRecursiveTyCon,
- tyConStupidTheta, synTyConRhs, isSynTyCon, tyConName,
- isNewTyCon, isDataTyCon, tyConKind,
- setTyConArgPoss )
-import DataCon ( DataCon, dataConUserType, dataConName,
- dataConFieldLabels, dataConTyCon, dataConAllTyVars,
- dataConFieldType, dataConResTys )
-import Var ( TyVar, idType, idName, tyVarName, setTyVarName )
-import VarSet ( elemVarSet, mkVarSet )
-import Name ( Name, getSrcLoc, tidyNameOcc, getOccName )
-import OccName ( initTidyOccEnv, tidyOccName )
+import TcEnv
+import TcTyDecls
+import TcClassDcl
+import TcHsType
+import TcMType
+import TcType
+import Type
+import Generics
+import Class
+import TyCon
+import DataCon
+import Var
+import VarSet
+import Name
+import OccName
import Outputable
-import Maybe ( isJust, fromJust, isNothing, catMaybes )
-import Maybes ( expectJust )
-import Monad ( unless )
-import Unify ( tcMatchTys, tcMatchTyX )
-import Util ( zipLazy, isSingleton, notNull, sortLe, mapAccumL )
-import List ( partition, elemIndex )
-import SrcLoc ( Located(..), unLoc, getLoc, srcLocSpan,
- srcSpanStart )
-import ListSetOps ( equivClasses, minusList )
-import Digraph ( SCC(..) )
-import DynFlags ( DynFlag( Opt_GlasgowExts, Opt_Generics,
- Opt_UnboxStrictFields, Opt_IndexedTypes ) )
+import Maybes
+import Monad
+import Unify
+import Util
+import SrcLoc
+import ListSetOps
+import Digraph
+import DynFlags
+
+import Data.List ( partition, elemIndex )
\end{code}
; let { -- Calculate rec-flag
; calc_rec = calcRecFlags boot_details rec_alg_tyclss
; tc_decl = addLocM (tcTyClDecl calc_rec) }
+
-- Type-check the type synonyms, and extend the envt
; syn_tycons <- tcSynDecls kc_syn_decls
; tcExtendGlobalEnv syn_tycons $ do
-- type functions can have a higher-kinded result
; let resultKind = mkArrowKinds (drop (length hs_typats) kinds) resKind
- ; typats <- zipWithM kcCheckHsType hs_typats kinds
+ ; typats <- TcRnMonad.zipWithM kcCheckHsType hs_typats kinds
; thing_inside tvs typats resultKind family
}
where
; cons' <- mappM (wrapLocM kc_con_decl) cons
; return (decl {tcdTyVars = tvs, tcdCtxt = ctxt', tcdCons = cons'}) }
where
- kc_con_decl (ConDecl name expl ex_tvs ex_ctxt details res) = do
+ -- doc comments are typechecked to Nothing here
+ kc_con_decl (ConDecl name expl ex_tvs ex_ctxt details res _) = do
kcHsTyVars ex_tvs $ \ex_tvs' -> do
ex_ctxt' <- kcHsContext ex_ctxt
details' <- kc_con_details details
res' <- case res of
ResTyH98 -> return ResTyH98
ResTyGADT ty -> do { ty' <- kcHsSigType ty; return (ResTyGADT ty') }
- return (ConDecl name expl ex_tvs' ex_ctxt' details' res')
+ return (ConDecl name expl ex_tvs' ex_ctxt' details' res' Nothing)
kc_con_details (PrefixCon btys)
= do { btys' <- mappM kc_larg_ty btys ; return (PrefixCon btys') }
kc_con_details (RecCon fields)
= do { fields' <- mappM kc_field fields; return (RecCon fields') }
- kc_field (fld, bty) = do { bty' <- kc_larg_ty bty ; return (fld, bty') }
+ kc_field (HsRecField fld bty d) = do { bty' <- kc_larg_ty bty ; return (HsRecField fld bty' d) }
kc_larg_ty bty = case new_or_data of
DataType -> kcHsSigType bty
-> TcM DataCon
tcConDecl unbox_strict NewType tycon tc_tvs -- Newtypes
- (ConDecl name _ ex_tvs ex_ctxt details ResTyH98)
+ (ConDecl name _ ex_tvs ex_ctxt details ResTyH98 _)
= do { let tc_datacon field_lbls arg_ty
= do { arg_ty' <- tcHsKindedType arg_ty -- No bang on newtype
; buildDataCon (unLoc name) False {- Prefix -}
; case details of
PrefixCon [arg_ty] -> tc_datacon [] arg_ty
- RecCon [(field_lbl, arg_ty)] -> tc_datacon [field_lbl] arg_ty
+ RecCon [HsRecField field_lbl arg_ty _] -> tc_datacon [field_lbl] arg_ty
other ->
failWithTc (newtypeFieldErr name (length (hsConArgs details)))
-- Check that the constructor has exactly one field
}
tcConDecl unbox_strict DataType tycon tc_tvs -- Data types
- (ConDecl name _ tvs ctxt details res_ty)
+ (ConDecl name _ tvs ctxt details res_ty _)
= tcTyVarBndrs tvs $ \ tvs' -> do
{ ctxt' <- tcHsKindedContext ctxt
; (univ_tvs, ex_tvs, eq_preds, data_tc) <- tcResultType tycon tc_tvs tvs' res_ty
InfixCon bty1 bty2 -> tc_datacon True [] [bty1,bty2]
RecCon fields -> tc_datacon False field_names btys
where
- (field_names, btys) = unzip fields
+ (field_names, btys) = unzip [ (n, t) | HsRecField n t _ <- fields ]
}
badSigTyDecl tc_name
= vcat [ ptext SLIT("Illegal kind signature") <+>
quotes (ppr tc_name)
- , nest 2 (parens $ ptext SLIT("Use -fglasgow-exts to allow indexed types")) ]
+ , nest 2 (parens $ ptext SLIT("Use -findexed-types to allow indexed types")) ]
badKindSigCtxt tc_name
= vcat [ ptext SLIT("Illegal context in kind signature") <+>
badIdxTyDecl tc_name
= vcat [ ptext SLIT("Illegal indexed type instance for") <+>
quotes (ppr tc_name)
- , nest 2 (parens $ ptext SLIT("Use -fglasgow-exts to allow indexed types")) ]
+ , nest 2 (parens $ ptext SLIT("Use -findexed-types to allow indexed types")) ]
badGadtIdxTyDecl tc_name
= vcat [ ptext SLIT("Illegal generalised algebraic data declaration for") <+>