tyConPrimRep,
AlgTyConRhs(..), visibleDataCons,
- AlgTyConParent(..), hasParent,
+ AlgTyConParent(..),
SynTyConRhs(..),
isFunTyCon, isUnLiftedTyCon, isProductTyCon,
import BasicTypes
import Name
import PrelNames
-import Maybe
import Maybes
import Outputable
import FastString
-- 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)
-- 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
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
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
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}