-%* *
-\subsection[TyGen-IdInfo]{Type generalisation info about an @Id@}
-%* *
-%************************************************************************
-
-Certain passes (notably usage inference) may change the type of an
-identifier, modifying all in-scope uses of that identifier
-appropriately to maintain type safety.
-
-However, some identifiers must not have their types changed in this
-way, because their types are conjured up in the front end of the
-compiler rather than being read from the interface file. Default
-methods, dictionary functions, record selectors, and others are in
-this category. (see comment at TcClassDcl.tcClassSig).
-
-To indicate this property, such identifiers are marked TyGenNever.
-
-Furthermore, if the usage inference generates a usage-specialised
-variant of a function, we must NOT re-infer a fully-generalised type
-at the next inference. This finer property is indicated by a
-TyGenUInfo on the identifier.
-
-\begin{code}
-data TyGenInfo
- = NoTyGenInfo -- no restriction on type generalisation
-
- | TyGenUInfo [Maybe Type] -- restrict generalisation of this Id to
- -- preserve specified usage annotations
-
- | TyGenNever -- never generalise the type of this Id
-\end{code}
-
-For TyGenUInfo, the list has one entry for each usage annotation on
-the type of the Id, in left-to-right pre-order (annotations come
-before the type they annotate). Nothing means no restriction; Just
-usOnce or Just usMany forces that annotation to that value. Other
-usage annotations are illegal.
-
-\begin{code}
-seqTyGenInfo :: TyGenInfo -> ()
-seqTyGenInfo NoTyGenInfo = ()
-seqTyGenInfo (TyGenUInfo us) = seqList us ()
-seqTyGenInfo TyGenNever = ()
-
-noTyGenInfo :: TyGenInfo
-noTyGenInfo = NoTyGenInfo
-
-isNoTyGenInfo :: TyGenInfo -> Bool
-isNoTyGenInfo NoTyGenInfo = True
-isNoTyGenInfo _ = False
-
--- NB: There's probably no need to write this information out to the interface file.
--- Why? Simply because imported identifiers never get their types re-inferred.
--- But it's definitely nice to see in dumps, it for debugging purposes.
-
-ppTyGenInfo :: TyGenInfo -> SDoc
-ppTyGenInfo NoTyGenInfo = empty
-ppTyGenInfo (TyGenUInfo us) = ptext SLIT("__G") <+> text (tyGenInfoString us)
-ppTyGenInfo TyGenNever = ptext SLIT("__G N")
-
-tyGenInfoString us = map go us
- where go Nothing = 'x' -- for legibility, choose
- go (Just u) | u `eqUsage` usOnce = '1' -- chars with identity
- | u `eqUsage` usMany = 'M' -- Z-encoding.
- go other = pprPanic "IdInfo.tyGenInfoString: unexpected annotation" (ppr other)
-
-instance Outputable TyGenInfo where
- ppr = ppTyGenInfo
-
-instance Show TyGenInfo where
- showsPrec p c = showsPrecSDoc p (ppr c)
-\end{code}
-
-
-%************************************************************************