X-Git-Url: http://git.megacz.com/?p=ghc-hetmet.git;a=blobdiff_plain;f=compiler%2Ftypes%2FTyCon.lhs;h=959575900470d3efc578565cd4cb4af4dadd4af6;hp=3ae5c3ef46954559098cab76b1fb04d9157ae8d6;hb=84923cc7de2a93c22a2f72daf9ac863959efae13;hpb=5e41a5afcc39480f4e60055843a5e4106b6f8875 diff --git a/compiler/types/TyCon.lhs b/compiler/types/TyCon.lhs index 3ae5c3e..9595759 100644 --- a/compiler/types/TyCon.lhs +++ b/compiler/types/TyCon.lhs @@ -13,7 +13,7 @@ module TyCon( tyConPrimRep, AlgTyConRhs(..), visibleDataCons, - AlgTyConParent(..), hasParent, + AlgTyConParent(..), SynTyConRhs(..), isFunTyCon, isUnLiftedTyCon, isProductTyCon, @@ -73,7 +73,6 @@ import Class import BasicTypes import Name import PrelNames -import Maybe import Maybes import Outputable import FastString @@ -115,6 +114,8 @@ data TyCon -- argument list (starting from 0). -- NB: Length is less than tyConArity -- if higher kind signature. + -- NB: Just _ <=> associated (not + -- toplevel) family algTcSelIds :: [Id], -- Its record selectors (empty if none) @@ -280,10 +281,6 @@ data AlgTyConParent = -- An ordinary type constructor has no parent. -- the representation type -- with the type instance -hasParent :: AlgTyConParent -> Bool -hasParent NoParentTyCon = False -hasParent _other = True - data SynTyConRhs = OpenSynTyCon Kind -- Type family: *result* kind given | SynonymTyCon Type -- Mentioning head type vars. Acts as a template for @@ -546,8 +543,8 @@ isAlgTyCon (TupleTyCon {}) = True isAlgTyCon other = False isDataTyCon :: TyCon -> Bool --- isDataTyCon returns True for data types that are represented by --- heap-allocated constructors. +-- isDataTyCon returns True for data types that are definitely +-- represented by heap-allocated constructors. -- These are srcutinised by Core-level @case@ expressions, and they -- get info tables allocated for them. -- True for all @data@ types @@ -559,7 +556,7 @@ isDataTyCon tc@(AlgTyCon {algTcRhs = rhs}) DataTyCon {} -> True OpenNewTyCon -> False NewTyCon {} -> False - AbstractTyCon -> pprPanic "isDataTyCon" (ppr tc) + AbstractTyCon -> False -- We don't know, so return False isDataTyCon (TupleTyCon {tyConBoxed = boxity}) = isBoxed boxity isDataTyCon other = False @@ -675,11 +672,24 @@ isCoercionTyCon :: TyCon -> Bool isCoercionTyCon (CoercionTyCon {}) = True isCoercionTyCon other = False +-- Identifies implicit tycons that, in particular, do not go into interface +-- files (because they are implicitly reconstructed when the interface is +-- read). +-- +-- Note that +-- +-- * associated families are implicit, as they are re-constructed from +-- the class declaration in which they reside, and +-- * family instances are *not* implicit as they represent the instance body +-- (similar to a dfun does that for a class instance). +-- isImplicitTyCon :: TyCon -> Bool -isImplicitTyCon SynTyCon{} = False -isImplicitTyCon AlgTyCon{algTcParent = parent} = hasParent parent -isImplicitTyCon other = True - -- catches: FunTyCon, TupleTyCon, PrimTyCon, +isImplicitTyCon tycon | isTyConAssoc tycon = True + | isSynTyCon tycon = False + | isAlgTyCon tycon = isClassTyCon tycon || + isTupleTyCon tycon +isImplicitTyCon _other = True + -- catches: FunTyCon, PrimTyCon, -- CoercionTyCon, SuperKindTyCon \end{code} @@ -827,7 +837,7 @@ isClassTyCon other_tycon = False tyConClass_maybe :: TyCon -> Maybe Class tyConClass_maybe (AlgTyCon {algTcParent = ClassTyCon clas}) = Just clas -tyConClass_maybe ther_tycon = Nothing +tyConClass_maybe other_tycon = Nothing isFamInstTyCon :: TyCon -> Bool isFamInstTyCon (AlgTyCon {algTcParent = FamilyTyCon _ _ _ }) = True @@ -836,13 +846,13 @@ isFamInstTyCon other_tycon = False tyConFamInst_maybe :: TyCon -> Maybe (TyCon, [Type]) tyConFamInst_maybe (AlgTyCon {algTcParent = FamilyTyCon fam instTys _}) = Just (fam, instTys) -tyConFamInst_maybe ther_tycon = +tyConFamInst_maybe other_tycon = Nothing tyConFamilyCoercion_maybe :: TyCon -> Maybe TyCon tyConFamilyCoercion_maybe (AlgTyCon {algTcParent = FamilyTyCon _ _ coe}) = Just coe -tyConFamilyCoercion_maybe ther_tycon = +tyConFamilyCoercion_maybe other_tycon = Nothing \end{code}