X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=compiler%2Ftypes%2FTyCon.lhs;h=e6366bea2b01d9b2f9ff10fc938b984f5128cb82;hb=911e7de13ab1c0e5426c7f234e0c8dd29185a2ba;hp=87ae25d1ca8eeabcf4c29c429cfd4a0b75187165;hpb=25f84fa7e4b84c3db5ba745a7881c009b778e0b1;p=ghc-hetmet.git diff --git a/compiler/types/TyCon.lhs b/compiler/types/TyCon.lhs index 87ae25d..e6366be 100644 --- a/compiler/types/TyCon.lhs +++ b/compiler/types/TyCon.lhs @@ -6,19 +6,12 @@ The @TyCon@ datatype \begin{code} -{-# OPTIONS -w #-} --- The above warning supression flag is a temporary kludge. --- While working on this module you are encouraged to remove it and fix --- any warnings in the module. See --- http://hackage.haskell.org/trac/ghc/wiki/Commentary/CodingStyle#Warnings --- for details - module TyCon( TyCon, FieldLabel, PrimRep(..), tyConPrimRep, - sizeofPrimRep, + primRepSizeW, AlgTyConRhs(..), visibleDataCons, TyConParent(..), @@ -33,7 +26,7 @@ module TyCon( isEnumerationTyCon, isGadtSyntaxTyCon, isOpenTyCon, assocTyConArgPoss_maybe, isTyConAssoc, setTyConArgPoss, isTupleTyCon, isUnboxedTupleTyCon, isBoxedTupleTyCon, tupleTyConBoxity, - isRecursiveTyCon, newTyConRep, newTyConRhs, newTyConEtadRhs, newTyConCo_maybe, + isRecursiveTyCon, newTyConRhs, newTyConEtadRhs, newTyConCo_maybe, isHiBootTyCon, isSuperKindTyCon, isCoercionTyCon_maybe, isCoercionTyCon, isImplicitTyCon, @@ -193,7 +186,7 @@ data TyCon tyConName :: Name, tyConArity :: Arity, coKindFun :: [Type] -> (Type,Type) - } -- INVARAINT: coKindFun is always applied to exactly 'arity' args + } -- INVARIANT: coKindFun is always applied to exactly 'arity' args -- E.g. for trans (c1 :: ta=tb) (c2 :: tb=tc), the coKindFun returns -- the kind as a pair of types: (ta,tc) @@ -256,27 +249,14 @@ data AlgTyConRhs -- See Note [Newtype coercions] -- Invariant: arity = #tvs in nt_etad_rhs; -- See Note [Newtype eta] + -- Watch out! If any newtypes become transparent + -- again check Trac #1072. - nt_etad_rhs :: ([TyVar], Type) , + nt_etad_rhs :: ([TyVar], Type) -- The same again, but this time eta-reduced -- hence the [TyVar] which may be shorter than the declared -- arity of the TyCon. See Note [Newtype eta] - - nt_rep :: Type -- Cached: the *ultimate* representation type - -- By 'ultimate' I mean that the top-level constructor - -- of the rep type is not itself a newtype or type synonym. - -- The rep type isn't entirely simple: - -- for a recursive newtype we pick () as the rep type - -- newtype T = MkT T - -- - -- This one does not need to be eta reduced; hence its - -- free type variables are conveniently tyConTyVars - -- Thus: - -- newtype T a = MkT [(a,Int)] - -- The rep type is [(a,Int)] - -- NB: the rep type isn't necessarily the original RHS of the - -- newtype decl, because the rep type looks through other - } -- newtypes. + } visibleDataCons :: AlgTyConRhs -> [DataCon] visibleDataCons AbstractTyCon = [] @@ -314,9 +294,9 @@ data TyConParent -- with :R7T's algTcParent = FamilyTyCon T [a] co okParent :: Name -> TyConParent -> Bool -- Checks invariants -okParent tc_name NoParentTyCon = True -okParent tc_name (ClassTyCon cls) = tyConName (classTyCon cls) == tc_name -okParent tc_name (FamilyTyCon fam_tc tys co_tc) = tyConArity fam_tc == length tys +okParent _ NoParentTyCon = True +okParent tc_name (ClassTyCon cls) = tyConName (classTyCon cls) == tc_name +okParent _ (FamilyTyCon fam_tc tys _co_tc) = tyConArity fam_tc == length tys -------------------- data SynTyConRhs @@ -392,7 +372,7 @@ Source code: w2 :: Foo T w2 = MkFoo (\(MkT x) -> case w1 of MkFoo f -> f x) -After desugaring, and discading the data constructors for the newtypes, +After desugaring, and discarding the data constructors for the newtypes, we get: w2 :: Foo T w2 = w1 @@ -475,18 +455,22 @@ data PrimRep | AddrRep -- a pointer, but not to a Haskell value | FloatRep | DoubleRep - --- Size of a PrimRep, in bytes -sizeofPrimRep :: PrimRep -> Int -sizeofPrimRep IntRep = wORD_SIZE -sizeofPrimRep WordRep = wORD_SIZE -sizeofPrimRep Int64Rep = wORD64_SIZE -sizeofPrimRep Word64Rep= wORD64_SIZE -sizeofPrimRep FloatRep = 4 -sizeofPrimRep DoubleRep= 8 -sizeofPrimRep AddrRep = wORD_SIZE -sizeofPrimRep PtrRep = wORD_SIZE -sizeofPrimRep VoidRep = 0 + deriving( Eq, Show ) + +instance Outputable PrimRep where + ppr r = text (show r) + +-- Size of a PrimRep, in words +primRepSizeW :: PrimRep -> Int +primRepSizeW IntRep = 1 +primRepSizeW WordRep = 1 +primRepSizeW Int64Rep = wORD64_SIZE `quot` wORD_SIZE +primRepSizeW Word64Rep= wORD64_SIZE `quot` wORD_SIZE +primRepSizeW FloatRep = 1 -- NB. might not take a full word +primRepSizeW DoubleRep= dOUBLE_SIZE `quot` wORD_SIZE +primRepSizeW AddrRep = 1 +primRepSizeW PtrRep = 1 +primRepSizeW VoidRep = 0 \end{code} %************************************************************************ @@ -514,6 +498,17 @@ mkFunTyCon name kind -- This is the making of a TyCon. Just the same as the old mkAlgTyCon, -- but now you also have to pass in the generic information about the type -- constructor - you can get hold of it easily (see Generics module) +mkAlgTyCon :: Name + -> Kind + -> [TyVar] + -> [PredType] + -> AlgTyConRhs + -> [Id] + -> TyConParent + -> RecFlag + -> Bool + -> Bool + -> TyCon mkAlgTyCon name kind tyvars stupid rhs sel_ids parent is_rec gen_info gadt_syn = AlgTyCon { tyConName = name, @@ -530,9 +525,11 @@ mkAlgTyCon name kind tyvars stupid rhs sel_ids parent is_rec gen_info gadt_syn hasGenerics = gen_info } +mkClassTyCon :: Name -> Kind -> [TyVar] -> AlgTyConRhs -> Class -> RecFlag -> TyCon mkClassTyCon name kind tyvars rhs clas is_rec = mkAlgTyCon name kind tyvars [] rhs [] (ClassTyCon clas) is_rec False False +mkTupleTyCon :: Name -> Kind -> Arity -> [TyVar] -> DataCon -> Boxity -> Bool -> TyCon mkTupleTyCon name kind arity tyvars con boxed gen_info = TupleTyCon { tyConUnique = nameUnique name, @@ -549,6 +546,7 @@ mkTupleTyCon name kind arity tyvars con boxed gen_info -- as primitive, but *lifted*, TyCons for now. They are lifted -- because the Haskell type T representing the (foreign) .NET -- type T is actually implemented (in ILX) as a thunk +mkForeignTyCon :: Name -> Maybe FastString -> Kind -> Arity -> TyCon mkForeignTyCon name ext_name kind arity = PrimTyCon { tyConName = name, @@ -562,16 +560,20 @@ mkForeignTyCon name ext_name kind arity -- most Prim tycons are lifted +mkPrimTyCon :: Name -> Kind -> Arity -> PrimRep -> TyCon mkPrimTyCon name kind arity rep = mkPrimTyCon' name kind arity rep True +mkVoidPrimTyCon :: Name -> Kind -> Arity -> TyCon mkVoidPrimTyCon name kind arity = mkPrimTyCon' name kind arity VoidRep True -- but RealWorld is lifted +mkLiftedPrimTyCon :: Name -> Kind -> Arity -> PrimRep -> TyCon mkLiftedPrimTyCon name kind arity rep = mkPrimTyCon' name kind arity rep False +mkPrimTyCon' :: Name -> Kind -> Arity -> PrimRep -> Bool -> TyCon mkPrimTyCon' name kind arity rep is_unlifted = PrimTyCon { tyConName = name, @@ -583,6 +585,7 @@ mkPrimTyCon' name kind arity rep is_unlifted tyConExtName = Nothing } +mkSynTyCon :: Name -> Kind -> [TyVar] -> SynTyConRhs -> TyConParent -> TyCon mkSynTyCon name kind tyvars rhs parent = SynTyCon { tyConName = name, @@ -594,6 +597,7 @@ mkSynTyCon name kind tyvars rhs parent synTcParent = parent } +mkCoercionTyCon :: Name -> Arity -> ([Type] -> (Type,Type)) -> TyCon mkCoercionTyCon name arity kindRule = CoercionTyCon { tyConName = name, @@ -603,6 +607,7 @@ mkCoercionTyCon name arity kindRule } -- Super kinds always have arity zero +mkSuperKindTyCon :: Name -> TyCon mkSuperKindTyCon name = SuperKindTyCon { tyConName = name, @@ -636,7 +641,7 @@ isUnLiftedTyCon _ = False isAlgTyCon :: TyCon -> Bool isAlgTyCon (AlgTyCon {}) = True isAlgTyCon (TupleTyCon {}) = True -isAlgTyCon other = False +isAlgTyCon _ = False isDataTyCon :: TyCon -> Bool -- isDataTyCon returns True for data types that are definitely @@ -651,25 +656,25 @@ isDataTyCon :: TyCon -> Bool -- NB: for a data type family, T, only the *instance* tycons are -- get an info table etc. The family tycon does not. -- Hence False for OpenTyCon -isDataTyCon tc@(AlgTyCon {algTcRhs = rhs}) +isDataTyCon (AlgTyCon {algTcRhs = rhs}) = case rhs of OpenTyCon {} -> False DataTyCon {} -> True NewTyCon {} -> False AbstractTyCon -> False -- We don't know, so return False isDataTyCon (TupleTyCon {tyConBoxed = boxity}) = isBoxed boxity -isDataTyCon other = False +isDataTyCon _ = False isNewTyCon :: TyCon -> Bool isNewTyCon (AlgTyCon {algTcRhs = NewTyCon {}}) = True -isNewTyCon other = False +isNewTyCon _ = False unwrapNewTyCon_maybe :: TyCon -> Maybe ([TyVar], Type, Maybe TyCon) unwrapNewTyCon_maybe (AlgTyCon { tyConTyVars = tvs, algTcRhs = NewTyCon { nt_co = mb_co, nt_rhs = rhs }}) = Just (tvs, rhs, mb_co) -unwrapNewTyCon_maybe other = Nothing +unwrapNewTyCon_maybe _ = Nothing isProductTyCon :: TyCon -> Bool -- A "product" tycon @@ -684,9 +689,9 @@ isProductTyCon tc@(AlgTyCon {}) = case algTcRhs tc of DataTyCon{ data_cons = [data_con] } -> isVanillaDataCon data_con NewTyCon {} -> True - other -> False + _ -> False isProductTyCon (TupleTyCon {}) = True -isProductTyCon other = False +isProductTyCon _ = False isSynTyCon :: TyCon -> Bool isSynTyCon (SynTyCon {}) = True @@ -704,11 +709,11 @@ isOpenSynTyCon tycon = isSynTyCon tycon && isOpenTyCon tycon isGadtSyntaxTyCon :: TyCon -> Bool isGadtSyntaxTyCon (AlgTyCon { algTcGadtSyntax = res }) = res -isGadtSyntaxTyCon other = False +isGadtSyntaxTyCon _ = False isEnumerationTyCon :: TyCon -> Bool isEnumerationTyCon (AlgTyCon {algTcRhs = DataTyCon { is_enum = res }}) = res -isEnumerationTyCon other = False +isEnumerationTyCon _ = False isOpenTyCon :: TyCon -> Bool isOpenTyCon (SynTyCon {synTcRhs = OpenSynTyCon _ _}) = True @@ -741,44 +746,45 @@ isTupleTyCon :: TyCon -> Bool -- get spat into the interface file as tuple tycons, so I don't think -- it matters. isTupleTyCon (TupleTyCon {}) = True -isTupleTyCon other = False +isTupleTyCon _ = False isUnboxedTupleTyCon :: TyCon -> Bool isUnboxedTupleTyCon (TupleTyCon {tyConBoxed = boxity}) = not (isBoxed boxity) -isUnboxedTupleTyCon other = False +isUnboxedTupleTyCon _ = False isBoxedTupleTyCon :: TyCon -> Bool isBoxedTupleTyCon (TupleTyCon {tyConBoxed = boxity}) = isBoxed boxity -isBoxedTupleTyCon other = False +isBoxedTupleTyCon _ = False +tupleTyConBoxity :: TyCon -> Boxity tupleTyConBoxity tc = tyConBoxed tc isRecursiveTyCon :: TyCon -> Bool isRecursiveTyCon (AlgTyCon {algTcRec = Recursive}) = True -isRecursiveTyCon other = False +isRecursiveTyCon _ = False isHiBootTyCon :: TyCon -> Bool -- Used for knot-tying in hi-boot files isHiBootTyCon (AlgTyCon {algTcRhs = AbstractTyCon}) = True -isHiBootTyCon other = False +isHiBootTyCon _ = False isForeignTyCon :: TyCon -> Bool -- isForeignTyCon identifies foreign-imported type constructors isForeignTyCon (PrimTyCon {tyConExtName = Just _}) = True -isForeignTyCon other = False +isForeignTyCon _ = False isSuperKindTyCon :: TyCon -> Bool isSuperKindTyCon (SuperKindTyCon {}) = True -isSuperKindTyCon other = False +isSuperKindTyCon _ = False isCoercionTyCon_maybe :: TyCon -> Maybe (Arity, [Type] -> (Type,Type)) isCoercionTyCon_maybe (CoercionTyCon {tyConArity = ar, coKindFun = rule}) = Just (ar, rule) -isCoercionTyCon_maybe other = Nothing +isCoercionTyCon_maybe _ = Nothing isCoercionTyCon :: TyCon -> Bool isCoercionTyCon (CoercionTyCon {}) = True -isCoercionTyCon other = False +isCoercionTyCon _ = False -- Identifies implicit tycons that, in particular, do not go into interface -- files (because they are implicitly reconstructed when the interface is @@ -814,11 +820,11 @@ tcExpandTyCon_maybe, coreExpandTyCon_maybe Type, -- Body type (not yet substituted) [Type]) -- Leftover args --- For the *typechecker* view, we expand synonyms only +-- For the *typechecker* view, we expand (closed) synonyms only tcExpandTyCon_maybe (SynTyCon {tyConTyVars = tvs, synTcRhs = SynonymTyCon rhs }) tys = expand tvs rhs tys -tcExpandTyCon_maybe other_tycon tys = Nothing +tcExpandTyCon_maybe _ _ = Nothing --------------- -- For the *Core* view, we expand synonyms only as well @@ -849,7 +855,7 @@ expand tvs rhs tys tyConHasGenerics :: TyCon -> Bool tyConHasGenerics (AlgTyCon {hasGenerics = hg}) = hg tyConHasGenerics (TupleTyCon {hasGenerics = hg}) = hg -tyConHasGenerics other = False -- Synonyms +tyConHasGenerics _ = False -- Synonyms tyConDataCons :: TyCon -> [DataCon] -- It's convenient for tyConDataCons to return the @@ -860,7 +866,7 @@ tyConDataCons_maybe :: TyCon -> Maybe [DataCon] tyConDataCons_maybe (AlgTyCon {algTcRhs = DataTyCon { data_cons = cons }}) = Just cons tyConDataCons_maybe (AlgTyCon {algTcRhs = NewTyCon { data_con = con }}) = Just [con] tyConDataCons_maybe (TupleTyCon {dataCon = con}) = Just [con] -tyConDataCons_maybe other = Nothing +tyConDataCons_maybe _ = Nothing tyConFamilySize :: TyCon -> Int tyConFamilySize (AlgTyCon {algTcRhs = DataTyCon {data_cons = cons}}) = @@ -868,13 +874,11 @@ tyConFamilySize (AlgTyCon {algTcRhs = DataTyCon {data_cons = cons}}) = tyConFamilySize (AlgTyCon {algTcRhs = NewTyCon {}}) = 1 tyConFamilySize (AlgTyCon {algTcRhs = OpenTyCon {}}) = 0 tyConFamilySize (TupleTyCon {}) = 1 -#ifdef DEBUG tyConFamilySize other = pprPanic "tyConFamilySize:" (ppr other) -#endif tyConSelIds :: TyCon -> [Id] tyConSelIds (AlgTyCon {algTcSelIds = fs}) = fs -tyConSelIds other_tycon = [] +tyConSelIds _ = [] algTyConRhs :: TyCon -> AlgTyConRhs algTyConRhs (AlgTyCon {algTcRhs = rhs}) = rhs @@ -891,10 +895,6 @@ newTyConEtadRhs :: TyCon -> ([TyVar], Type) newTyConEtadRhs (AlgTyCon {algTcRhs = NewTyCon { nt_etad_rhs = tvs_rhs }}) = tvs_rhs newTyConEtadRhs tycon = pprPanic "newTyConEtadRhs" (ppr tycon) -newTyConRep :: TyCon -> ([TyVar], Type) -newTyConRep (AlgTyCon {tyConTyVars = tvs, algTcRhs = NewTyCon { nt_rep = rep }}) = (tvs, rep) -newTyConRep tycon = pprPanic "newTyConRep" (ppr tycon) - newTyConCo_maybe :: TyCon -> Maybe TyCon newTyConCo_maybe (AlgTyCon {algTcRhs = NewTyCon { nt_co = co }}) = co newTyConCo_maybe _ = Nothing @@ -945,23 +945,23 @@ maybeTyConSingleCon tc = pprPanic "maybeTyConSingleCon: unexpected tycon " $ ppr \begin{code} isClassTyCon :: TyCon -> Bool isClassTyCon (AlgTyCon {algTcParent = ClassTyCon _}) = True -isClassTyCon other_tycon = False +isClassTyCon _ = False tyConClass_maybe :: TyCon -> Maybe Class tyConClass_maybe (AlgTyCon {algTcParent = ClassTyCon clas}) = Just clas -tyConClass_maybe other_tycon = Nothing +tyConClass_maybe _ = Nothing isFamInstTyCon :: TyCon -> Bool isFamInstTyCon (AlgTyCon {algTcParent = FamilyTyCon _ _ _ }) = True isFamInstTyCon (SynTyCon {synTcParent = FamilyTyCon _ _ _ }) = True -isFamInstTyCon other_tycon = False +isFamInstTyCon _ = False tyConFamInst_maybe :: TyCon -> Maybe (TyCon, [Type]) tyConFamInst_maybe (AlgTyCon {algTcParent = FamilyTyCon fam instTys _}) = Just (fam, instTys) tyConFamInst_maybe (SynTyCon {synTcParent = FamilyTyCon fam instTys _}) = Just (fam, instTys) -tyConFamInst_maybe other_tycon = +tyConFamInst_maybe _ = Nothing tyConFamilyCoercion_maybe :: TyCon -> Maybe TyCon @@ -969,7 +969,7 @@ tyConFamilyCoercion_maybe (AlgTyCon {algTcParent = FamilyTyCon _ _ coe}) = Just coe tyConFamilyCoercion_maybe (SynTyCon {synTcParent = FamilyTyCon _ _ coe}) = Just coe -tyConFamilyCoercion_maybe other_tycon = +tyConFamilyCoercion_maybe _ = Nothing \end{code}