summaryrefslogtreecommitdiff
path: root/ghc/compiler/uniType/TyCon.lhs
diff options
context:
space:
mode:
Diffstat (limited to 'ghc/compiler/uniType/TyCon.lhs')
-rw-r--r--ghc/compiler/uniType/TyCon.lhs585
1 files changed, 585 insertions, 0 deletions
diff --git a/ghc/compiler/uniType/TyCon.lhs b/ghc/compiler/uniType/TyCon.lhs
new file mode 100644
index 0000000000..ddf1716c31
--- /dev/null
+++ b/ghc/compiler/uniType/TyCon.lhs
@@ -0,0 +1,585 @@
+%
+% (c) The GRASP/AQUA Project, Glasgow University, 1992-1995
+%
+\section[TyCon]{Type constructors}
+
+\begin{code}
+#include "HsVersions.h"
+
+module TyCon (
+ TyCon(..), -- not abstract; usually grabbed via AbsUniType
+ Arity(..), -- synonym for Int
+ mkSynonymTyCon, mkDataTyCon, mkTupleTyCon,
+ mkPrimTyCon, mkSpecTyCon,
+#ifdef DPH
+ mkProcessorTyCon,
+ mkPodizedPodTyCon,
+ isProcessorTyCon,
+ isPodizedPodTyCon,
+ getPodizedPodDimension,
+#endif {- Data Parallel Haskell -}
+
+ isSynTyCon, isVisibleSynTyCon, isDataTyCon,
+ isPrimTyCon, isBoxedTyCon,
+ maybeCharLikeTyCon, maybeIntLikeTyCon,
+ maybeFloatLikeTyCon, maybeDoubleLikeTyCon,
+ isEnumerationTyCon, --UNUSED: isEnumerationTyConMostly,
+ isTupleTyCon,
+ isLocalSpecTyCon, isLocalGenTyCon, isBigTupleTyCon,
+ maybeSingleConstructorTyCon,
+ derivedFor, --UNUSED: preludeClassDerivedFor,
+ cmpTyCon, eqTyCon,
+
+ getTyConArity, getTyConDataCons,
+ getTyConTyVarTemplates,
+ getTyConKind,
+ getTyConDerivings,
+ getTyConFamilySize,
+
+ -- to make the interface self-sufficient...
+ Class, Id, FullName, PrimKind, TyVarTemplate, UniType,
+ Unique, Maybe, DataCon(..)
+ ) where
+
+IMPORT_Trace -- ToDo: rm (debugging)
+
+import AbsPrel ( charPrimTy, intPrimTy, floatPrimTy,
+ doublePrimTy, pRELUDE_BUILTIN
+ )
+
+import Class ( getClassKey, Class
+ IF_ATTACK_PRAGMAS(COMMA cmpClass)
+ )
+import Id -- DPH wants to export various things as well
+import IdInfo
+import Maybes ( Maybe(..) )
+import NameTypes -- various types to do with names
+import Outputable -- class for printing, forcing
+import Pretty -- pretty-printing utilities
+import PrimKind ( PrimKind(..) )
+import SrcLoc
+import TyVar ( TyVarTemplate, alphaTyVars )
+import Unique ( cmpUnique, Unique )
+import UniTyFuns ( getTauType, getUniDataTyCon, pprTyCon,
+ cmpUniTypeMaybeList, specMaybeTysSuffix
+ IF_ATTACK_PRAGMAS(COMMA pprUniType COMMA splitType)
+ )
+import UniType ( UniType
+ IF_ATTACK_PRAGMAS(COMMA cmpUniType)
+ )
+import Util
+\end{code}
+
+%************************************************************************
+%* *
+\subsection[TyCon-basics]{@TyCon@ type and basic operations}
+%* *
+%************************************************************************
+
+\begin{code}
+data TyCon
+ = SynonymTyCon Unique{-TyConKey-} -- for fast comparison
+ FullName
+ Arity
+ [TyVarTemplate]-- Argument type variables
+ UniType -- Right-hand side, mentioning these type vars
+ -- Acts as a template for the expansion when
+ -- the tycon is applied to some types.
+ Bool -- True <=> expansion is visible to user;
+ -- i.e., *not* abstract
+
+ | DataTyCon Unique{-TyConKey-}
+ FullName
+ Arity
+ [TyVarTemplate] -- see note below
+ [Id] -- its data constructors
+ [Class] -- classes which have derived instances
+ Bool -- True <=> data constructors are visible
+ -- to user; i.e., *not* abstract
+
+ | TupleTyCon Arity -- just a special case of DataTyCon
+
+ | PrimTyCon -- Primitive types; cannot be defined in Haskell
+ -- Always unboxed; hence never represented by a closure
+ -- Often represented by a bit-pattern for the thing
+ -- itself (eg Int#), but sometimes by a pointer to
+ -- a heap-allocated object (eg ArrInt#).
+ -- The primitive types Arr# and StablePtr# have
+ -- parameters (hence arity /= 0); but the rest don't.
+ Unique{-TyConKey-}
+ FullName
+ Arity -- Arity is *usually* 0.
+ ([PrimKind] -> PrimKind)
+ -- Only arrays use the list in a non-trivial way.
+ -- Length of that list must == arity.
+
+ -- Used only for naming purposes in CLabels
+ | SpecTyCon TyCon -- original data (or tuple) tycon
+ [Maybe UniType] -- specialising types
+
+#ifdef DPH
+ | ProcessorTyCon Arity -- special cased in same way as tuples
+
+ | PodizedPodTyCon Int -- podized dimension
+ TyCon -- Thing the pod contains
+#endif
+
+type Arity = Int
+\end{code}
+
+{\em Note about the the @[TyVarTemplates]@ in @DataTyCon@ (and
+@SynonymTyCon@, too? ToDo):} they should be the type variables which
+appeared in the original @data@ declaration. They are there {\em for
+documentation purposes only}. In particular, when printing out
+interface files, we want to use the same type-variable names as
+appeared in the @data@ declaration for that type constructor.
+However, they have no semantic significance.
+
+We could also ensure that the data constructors in the @[Id]@ had the
+{\em same} type vars in their @[TyVarTemplate]@ lists, so that we
+don't have to do a translation on printout.
+{\em End of note.}
+
+Constructor functions, and simple access functions:
+\begin{code}
+mkSynonymTyCon = SynonymTyCon
+mkDataTyCon = DataTyCon
+mkTupleTyCon = TupleTyCon
+mkPrimTyCon = PrimTyCon
+mkSpecTyCon = SpecTyCon
+
+#ifdef DPH
+mkProcessorTyCon= ProcessorTyCon
+mkPodizedPodTyCon = PodizedPodTyCon
+#endif {- Data Parallell Haskell -}
+\end{code}
+
+%************************************************************************
+%* *
+\subsection[TyCon-extractors]{Extractors for @TyCon@}
+%* *
+%************************************************************************
+
+\begin{code}
+getTyConArity (PrimTyCon _ _ a _) = a
+getTyConArity (SynonymTyCon _ _ a _ _ _) = a
+getTyConArity (DataTyCon _ _ a _ _ _ _) = a
+getTyConArity (SpecTyCon tc tys) = getTyConArity tc - length tys
+getTyConArity (TupleTyCon a) = a
+#ifdef DPH
+getTyConArity (ProcessorTyCon a) = a
+getTyConArity (PodizedPodTyCon _ _) = panic "getTyConArity: pod"
+#endif {- Data Parallel Haskell -}
+
+getTyConKind (PrimTyCon _ _ _ kind_fn) kinds = kind_fn kinds
+#ifdef DPH
+getTyConKind (PodizedPodTyCon _ tc) kinds = getTyConKind tc kinds
+#endif {- Data Parallel Haskell -}
+getTyConKind other kinds = PtrKind -- the "default"
+
+getTyConDerivings (DataTyCon _ _ _ _ _ derivings _) = derivings
+getTyConDerivings (SpecTyCon tc tys) = panic "getTyConDerivings:SpecTyCon"
+#ifdef DPH
+getTyConDerivings (PodizedPodTyCon _ _) = panic "getTyConDerivings:pod"
+#endif {- Data Parallel Haskell -}
+getTyConDerivings other = []
+ -- NB: we do *not* report the PreludeCore types "derivings"...
+
+getTyConDataCons (DataTyCon _ _ _ _ data_cons _ _) = data_cons
+getTyConDataCons (SpecTyCon tc tys) = panic "getTyConDataCons:SpecTyCon"
+getTyConDataCons (TupleTyCon a) = [mkTupleCon a]
+#ifdef DPH
+getTyConDataCons (ProcessorTyCon a) = [mkProcessorCon a]
+getTyConDataCons (PodizedPodTyCon _ _) = panic "getTyConDataCons: pod"
+#endif {- Data Parallel Haskell -}
+getTyConDataCons other_tycon = []
+\end{code}
+For the use of @getTyConDataCons@ in @MkUnfoldings@, the behaviour
+above is right: return @[]@ if not an algebraic data type. I am not
+certain if that's right for all uses (perhaps should @panic@?) [WDP]
+
+The following function returns (free) type-variables associated with a
+given @TyCon@. As the information about these variables is distributed
+over the @TyCon@'s constructors we take them from the type of any
+of the constructors assuming that the variables in the remaining
+type constructors are the same (responsible for keeping this assumption
+valid is the typechecker). ToDo: rm this old comment?
+\begin{code}
+getTyConTyVarTemplates (SynonymTyCon _ _ _ tvs _ _) = tvs
+getTyConTyVarTemplates (DataTyCon _ _ _ tvs _ _ _) = tvs
+getTyConTyVarTemplates (SpecTyCon tc tys) = panic "getTyConTyVarTemplates:SpecTyCon"
+getTyConTyVarTemplates (TupleTyCon a) = take a alphaTyVars
+getTyConTyVarTemplates (PrimTyCon _ _ _ _) = [] -- ToDo: ???
+#ifdef DPH
+getTyConTyVarTemplates (ProcessorTyCon a) = take a alphaTyVars
+getTyConTyVarTemplates (PodizedPodTyCon _ _) = panic "getTyConTyVarTem"
+#endif {- Data Parallel Haskell -}
+\end{code}
+
+\begin{code}
+getTyConFamilySize :: TyCon -> Maybe Int -- return Nothing if we don't know
+
+getTyConFamilySize (TupleTyCon _) = Just 1
+getTyConFamilySize (SpecTyCon tc tys) = getTyConFamilySize tc
+getTyConFamilySize (DataTyCon _ _ _ _ dcs _ _)
+ = let
+ no_data_cons = length dcs
+ in
+ if no_data_cons == 0 then Nothing else Just no_data_cons
+
+#ifdef DEBUG
+ -- ToDo: if 0 then the answer is really "I don't know"; what then?
+getTyConFamilySize tc@(PrimTyCon _ _ _ _)
+ = pprPanic "getTyConFamilySize:prim:" (ppr PprDebug tc)
+getTyConFamilySize (SynonymTyCon _ _ _ _ expand _)
+ = pprTrace "getTyConFamilySize:Syn:" (ppr PprDebug expand) (
+ let
+ (tycon,_,data_cons) = getUniDataTyCon (getTauType expand)
+ no_data_cons = length data_cons
+ in
+ if no_data_cons == 0 then Nothing else Just no_data_cons
+ )
+#endif
+#ifdef DPH
+getTyConFamilySize (ProcessorTyCon _) = Just 1
+getTyConFamilySize (PodizedPodTyCon _ _) = panic "getTyConFamilySize: Pod"
+#endif {- Data Parallel Haskell -}
+\end{code}
+
+%************************************************************************
+%* *
+\subsection[TyCon-predicates]{Predicates on @TyCon@s}
+%* *
+%************************************************************************
+
+\begin{code}
+-- True <=> Algebraic data type
+isDataTyCon (DataTyCon _ _ _ _ _ _ _) = True
+isDataTyCon (SpecTyCon tc tys) = isDataTyCon tc
+isDataTyCon (TupleTyCon _) = True
+#ifdef DPH
+isDataTyCon (ProcessorTyCon _) = True
+isDataTyCon (PodizedPodTyCon _ tc) = isDataTyCon tc
+#endif {- Data Parallel Haskell -}
+isDataTyCon other = False
+
+-- True <=> Synonym
+isSynTyCon (SynonymTyCon _ _ _ _ _ _) = True
+isSynTyCon (SpecTyCon tc tys) = panic "isSynTyCon: SpecTyCon"
+#ifdef DPH
+isSynTyCon (PodizedPodTyCon _ _) = panic "isSynTyCon: Pod"
+#endif {- Data Parallel Haskell -}
+isSynTyCon other = False
+
+isVisibleSynTyCon (SynonymTyCon _ _ _ _ _ visible) = visible
+isVisibleSynTyCon other_tycon = panic "isVisibleSynTyCon"
+
+isPrimTyCon (PrimTyCon _ _ _ _) = True
+isPrimTyCon (SpecTyCon tc tys) = isPrimTyCon tc
+#ifdef DPH
+isPrimTyCon (PodizedPodTyCon _ tc) = isPrimTyCon tc
+#endif {- Data Parallel Haskell -}
+isPrimTyCon other = False
+
+-- At present there are no unboxed non-primitive types, so isBoxedTyCon is
+-- just the negation of isPrimTyCon.
+isBoxedTyCon (PrimTyCon _ _ _ _) = False
+isBoxedTyCon (SpecTyCon tc tys) = isBoxedTyCon tc
+#ifdef DPH
+isBoxedTyCon (PodizedPodTyCon _ tc) = isBoxedTyCon tc
+#endif {- Data Parallel Haskell -}
+isBoxedTyCon other = True
+
+\end{code}
+
+The @maybeCharLikeTyCon@ predicate tests for a tycon with no type
+variables, and one constructor which has one argument of type
+@CharPrim@. Similarly @maybeIntLikeTyCon@, etc.
+
+ToDo:SpecTyCon Do we want to CharLike etc for SpecTyCons ???
+
+\begin{code}
+maybeCharLikeTyCon (DataTyCon _ _ _ [] [con] [] _) = maybe_foo_like con charPrimTy
+#ifdef DPH
+maybeCharLikeTyCon (PodizedPodTyCon _ _) = panic "maybeCharLikeTyCon: Pod"
+#endif {- Data Parallel Haskell -}
+maybeCharLikeTyCon other = Nothing
+
+maybeIntLikeTyCon (DataTyCon _ _ _ [] [con] [] _) = maybe_foo_like con intPrimTy
+#ifdef DPH
+maybeIntLikeTyCon (PodizedPodTyCon _ _) = panic "maybeIntLikeTyCon: Pod"
+#endif {- Data Parallel Haskell -}
+maybeIntLikeTyCon other = Nothing
+
+maybeFloatLikeTyCon (DataTyCon _ _ _ [] [con] [] _) = maybe_foo_like con floatPrimTy
+#ifdef DPH
+maybeFloatLikeTyCon (PodizedPodTyCon _ _) = panic "maybeFloatLikeTyCon: Pod"
+#endif {- Data Parallel Haskell -}
+maybeFloatLikeTyCon other = Nothing
+
+maybeDoubleLikeTyCon (DataTyCon _ _ _ [] [con] [] _) = maybe_foo_like con doublePrimTy
+#ifdef DPH
+maybeDoubleLikeTyCon (PodizedPodTyCon _ _) = panic "maybeDoubleLikeTyCon: Pod"
+#endif {- Data Parallel Haskell -}
+maybeDoubleLikeTyCon other = Nothing
+
+maybe_foo_like con prim_type_to_match
+ = case (getDataConSig con) of
+ ([], [], [should_be_prim], _)
+ | should_be_prim == prim_type_to_match -> Just con
+ other -> Nothing
+
+#ifdef DPH
+isProcessorTyCon :: TyCon -> Bool
+isProcessorTyCon (ProcessorTyCon _) = True
+isProcessorTyCon other = False
+
+isPodizedPodTyCon :: TyCon -> Bool
+isPodizedPodTyCon (PodizedPodTyCon _ _) = True
+isPodizedPodTyCon other = False
+
+getPodizedPodDimension::TyCon -> Int
+getPodizedPodDimension (PodizedPodTyCon d _) = d
+#endif {- Data Parallel Haskell -}
+\end{code}
+
+\begin{code}
+isEnumerationTyCon :: TyCon -> Bool
+
+isEnumerationTyCon (TupleTyCon arity)
+ = arity == 0
+isEnumerationTyCon (DataTyCon _ _ _ _ data_cons _ _)
+ = not (null data_cons) && all is_nullary data_cons
+ where
+ is_nullary con = case (getDataConSig con) of { (_,_, arg_tys, _) ->
+ null arg_tys }
+#ifdef DEBUG
+-- isEnumerationTyCon (SpecTyCon tc tys) -- ToDo:SpecTyCon
+isEnumerationTyCon other = pprPanic "isEnumerationTyCon: " (ppr PprShowAll other)
+#endif
+
+-- this one is more of a *heuristic*
+{- UNUSED:
+isEnumerationTyConMostly :: TyCon -> Bool
+
+isEnumerationTyConMostly (TupleTyCon arity) = arity == 0
+
+isEnumerationTyConMostly tycon@(DataTyCon _ _ _ _ data_cons _ _)
+ = isEnumerationTyCon tycon
+ || four_or_more data_cons 0
+ where
+ four_or_more :: [Id] -> Int -> Bool
+
+ four_or_more [] acc = if acc >= 4 then True else False
+ four_or_more (c:cs) acc
+ = case (getDataConSig c) of { (_,_, arg_tys, _) ->
+ four_or_more cs (if (null arg_tys) then acc+1 else acc)
+ }
+-- isEnumerationTyConMostly (SpecTyCon tc tys) -- ToDo:SpecTyCon
+-}
+
+
+maybeSingleConstructorTyCon :: TyCon -> Maybe Id
+maybeSingleConstructorTyCon (TupleTyCon arity) = Just (mkTupleCon arity)
+maybeSingleConstructorTyCon (DataTyCon _ _ _ _ [c] _ _) = Just c
+maybeSingleConstructorTyCon (DataTyCon _ _ _ _ _ _ _) = Nothing
+maybeSingleConstructorTyCon (PrimTyCon _ _ _ _) = Nothing
+maybeSingleConstructorTyCon (SpecTyCon tc tys) = panic "maybeSingleConstructorTyCon:SpecTyCon"
+ -- requires DataCons of TyCon
+\end{code}
+
+@derivedFor@ reports if we have an {\em obviously}-derived instance
+for the given class/tycon. Of course, you might be deriving something
+because it a superclass of some other obviously-derived class---this
+function doesn't deal with that.
+
+ToDo:SpecTyCon Do we want derivedFor etc for SpecTyCons ???
+
+\begin{code}
+derivedFor :: Class -> TyCon -> Bool
+
+clas `derivedFor` (DataTyCon _ _ _ _ _ derivs _) = clas `is_elem` derivs
+clas `derivedFor` something_weird = False
+
+x `is_elem` y = isIn "X_derivedFor" x y
+
+{- UNUSED:
+preludeClassDerivedFor :: Unique{-ClassKey-} -> TyCon -> Bool
+
+preludeClassDerivedFor key (DataTyCon _ _ _ _ _ derivs _)
+ = key `is_elem` (map getClassKey derivs)
+preludeClassDerivedFor key something_weird = False
+-}
+\end{code}
+
+\begin{code}
+isTupleTyCon (TupleTyCon arity) = arity >= 2 -- treat "0-tuple" specially
+isTupleTyCon (SpecTyCon tc tys) = isTupleTyCon tc
+isTupleTyCon other = False
+\end{code}
+
+@isLocalSpecTyCon@ determines if a tycon has specialisations created
+locally: locally defined tycons and any tycons from the prelude.
+But *not* if we're compiling the prelude itself...
+
+@isLocalGenTyCon@ determines if constructor code for a tycon is
+generated locally: locally defined tycons and big tuple tycons.
+
+\begin{code}
+isLocalSpecTyCon :: Bool -> TyCon -> Bool
+
+isLocalSpecTyCon compiling_prelude tc
+ = isLocallyDefined tc || (fromPreludeCore tc && not compiling_prelude)
+
+isLocalGenTyCon (SpecTyCon tc tys) = isLocalGenTyCon tc
+isLocalGenTyCon tc = isBigTupleTyCon tc || isLocallyDefined tc
+
+isBigTupleTyCon (TupleTyCon arity) = arity > 32
+ -- Tuple0 to Tuple32 declared in prelude
+ -- HEY! Nice magic constant! WDP 95/06
+isBigTupleTyCon (SpecTyCon tc _) = isBigTupleTyCon tc
+isBigTupleTyCon _ = False
+\end{code}
+
+%************************************************************************
+%* *
+\subsection[TyCon-instances]{Instance declarations for @TyCon@}
+%* *
+%************************************************************************
+
+@TyCon@s are compared by comparing their @Unique@s.
+
+The strictness analyser needs @Ord@. It is a lexicographic order with
+the property @(a<=b) || (b<=a)@.
+
+\begin{code}
+cmpTyCon (SynonymTyCon k1 _ _ _ _ _) (SynonymTyCon k2 _ _ _ _ _)= cmpUnique k1 k2
+cmpTyCon (DataTyCon k1 _ _ _ _ _ _) (DataTyCon k2 _ _ _ _ _ _) = cmpUnique k1 k2
+cmpTyCon (TupleTyCon a1) (TupleTyCon a2) = cmp_i a1 a2
+cmpTyCon (PrimTyCon k1 _ _ _) (PrimTyCon k2 _ _ _) = cmpUnique k1 k2
+cmpTyCon (SpecTyCon tc1 mtys1) (SpecTyCon tc2 mtys2)
+ = case cmpTyCon tc1 tc2 of { EQ_ -> cmpUniTypeMaybeList mtys1 mtys2; other -> other }
+#ifdef DPH
+cmpTyCon (ProcessorTyCon a1) (ProcessorTyCon a2) = cmp_i a1 a2
+cmpTyCon (PodizedPodTyCon d1 tc1) (PodizedPodTyCon d2 tc2)
+ = case cmp_i d1 d2 of { EQ_ -> cmpTyCon tc1 tc2; other -> other }
+#endif {- Data Parallel Haskell -}
+
+ -- now we *know* the tags are different, so...
+cmpTyCon other_1 other_2
+ = let
+ tag1 = tag_TyCon other_1
+ tag2 = tag_TyCon other_2
+ in
+ if tag1 _LT_ tag2 then LT_ else GT_
+ where
+ tag_TyCon (SynonymTyCon _ _ _ _ _ _) = (ILIT(1) :: FAST_INT)
+ tag_TyCon (DataTyCon _ _ _ _ _ _ _)= ILIT(2)
+ tag_TyCon (TupleTyCon _) = ILIT(3)
+ tag_TyCon (PrimTyCon _ _ _ _) = ILIT(4)
+ tag_TyCon (SpecTyCon _ _) = ILIT(5)
+#ifdef DPH
+ tag_TyCon (ProcessorTyCon _) = ILIT(6)
+ tag_TyCon (PodizedPodTyCon _ _) = ILIT(7)
+#endif {- Data Parallel Haskell -}
+
+cmp_i :: Int -> Int -> TAG_
+cmp_i a1 a2
+ = if a1 == a2 then EQ_ else if a1 < a2 then LT_ else GT_
+\end{code}
+
+\begin{code}
+eqTyCon :: TyCon -> TyCon -> Bool
+
+eqTyCon a b = case cmpTyCon a b of { EQ_ -> True; _ -> False }
+
+instance Eq TyCon where
+ a == b = case cmpTyCon a b of { EQ_ -> True; _ -> False }
+ a /= b = case cmpTyCon a b of { EQ_ -> False; _ -> True }
+
+instance Ord TyCon where
+ a <= b = case cmpTyCon a b of { LT_ -> True; EQ_ -> True; GT__ -> False }
+ a < b = case cmpTyCon a b of { LT_ -> True; EQ_ -> False; GT__ -> False }
+ a >= b = case cmpTyCon a b of { LT_ -> False; EQ_ -> True; GT__ -> True }
+ a > b = case cmpTyCon a b of { LT_ -> False; EQ_ -> False; GT__ -> True }
+#ifdef __GLASGOW_HASKELL__
+ _tagCmp a b = case cmpTyCon a b of { LT_ -> _LT; EQ_ -> _EQ; GT__ -> _GT }
+#endif
+\end{code}
+
+\begin{code}
+instance NamedThing TyCon where
+ getExportFlag (TupleTyCon _) = NotExported
+#ifdef DPH
+ getExportFlag (ProcessorTyCon _) = NotExported
+ getExportFlag (PodizedPodTyCon _ tc) = getExportFlag tc
+#endif {- Data Parallel Haskell -}
+ getExportFlag other = getExportFlag (get_name other)
+
+ isLocallyDefined (TupleTyCon _) = False
+#ifdef DPH
+ isLocallyDefined (ProcessorTyCon _) = False
+ isLocallyDefined (PodizedPodTyCon _ tc) = isLocallyDefined tc
+#endif {- Data Parallel Haskell -}
+ isLocallyDefined other = isLocallyDefined (get_name other)
+
+ getOrigName (TupleTyCon a) = (pRELUDE_BUILTIN, _PK_ ("Tuple" ++ (show a)))
+ getOrigName (SpecTyCon tc tys) = let (m,n) = getOrigName tc in
+ (m, n _APPEND_ specMaybeTysSuffix tys)
+#ifdef DPH
+ getOrigName (ProcessorTyCon a) = ("PreludeBuiltin", "Processor" ++ (show a))
+ getOrigName (PodizedPodTyCon d tc) = let (m,n) = getOrigName tc in
+ (m,n++"Pod"++show d)
+#endif {- Data Parallel Haskell -}
+ getOrigName other = getOrigName (get_name other)
+
+ getOccurrenceName (TupleTyCon a) = _PK_ ("Tuple" ++ (show a))
+ getOccurrenceName (SpecTyCon tc tys) = getOccurrenceName tc _APPEND_ specMaybeTysSuffix tys
+#ifdef DPH
+ getOccurrenceName (ProcessorTyCon a) = "Processor" ++ (show a)
+ getOccurrenceName (PodizedPodTyCon d tc) = getOccurrenceName tc ++
+ "Pod" ++ show d
+#endif {- Data Parallel Haskell -}
+ getOccurrenceName other = getOccurrenceName (get_name other)
+
+ getInformingModules (TupleTyCon a) = panic "getInformingModule:TupleTyCon"
+#ifdef DPH
+ getInformingModules (ProcessorTyCon a) = "Processor" ++ (show a)
+ getInformingModules (PodizedPodTyCon d tc) = getInformingModule tc ++
+ "Pod" ++ show d
+#endif {- Data Parallel Haskell -}
+ getInformingModules other = getInformingModules (get_name other)
+
+ getSrcLoc (TupleTyCon _) = mkBuiltinSrcLoc
+#ifdef DPH
+ getSrcLoc (ProcessorTyCon _) = mkBuiltinSrcLoc
+ getSrcLoc (PodizedPodTyCon _ tc) = getSrcLoc tc
+#endif {- Data Parallel Haskell -}
+ getSrcLoc other = getSrcLoc (get_name other)
+
+ getTheUnique other = panic "NamedThing.TyCon.getTheUnique"
+
+ fromPreludeCore (TupleTyCon a) = True
+#ifdef DPH
+ fromPreludeCore (ProcessorTyCon a) = True
+ fromPreludeCore (PodizedPodTyCon _ tc) = fromPreludeCore tc
+#endif {- Data Parallel Haskell -}
+ fromPreludeCore other = fromPreludeCore (get_name other)
+
+ hasType = panic "NamedThing.TyCon.hasType"
+ getType = panic "NamedThing.TyCon.getType"
+\end{code}
+
+Emphatically un-exported:
+\begin{code}
+get_name (SynonymTyCon _ n _ _ _ _) = n
+get_name (DataTyCon _ n _ _ _ _ _) = n
+get_name (PrimTyCon _ n _ _) = n
+get_name (SpecTyCon tc _) = get_name tc
+\end{code}
+
+And the usual output stuff:
+\begin{code}
+instance Outputable TyCon where
+ ppr sty tycon = pprTyCon sty tycon [{-No Specialisations-}]
+\end{code}