2 % (c) The AQUA Project, Glasgow University, 1996
4 \section[PprType]{Printing Types, TyVars, Classes, ClassOps, TyCons}
7 #include "HsVersions.h"
10 GenTyVar, pprGenTyVar,
11 TyCon, pprTyCon, showTyCon,
13 pprGenType, pprParendGenType,
14 pprType, pprParendType,
20 GenClassOp, pprGenClassOp
24 import IdLoop -- for paranoia checking
25 import TyLoop -- for paranoia checking
28 -- (PprType can see all the representations it's trying to print)
29 import Type ( GenType(..), maybeAppTyCon,
30 splitForAllTy, splitSigmaTy, splitRhoTy, splitAppTy )
31 import TyVar ( GenTyVar(..) )
32 import TyCon ( TyCon(..), NewOrData )
33 import Class ( Class(..), GenClass(..),
34 ClassOp(..), GenClassOp(..) )
35 import Kind ( Kind(..) )
38 import CStrings ( identToC )
39 import CmdLineOpts ( opt_OmitInterfacePragmas )
40 import Maybes ( maybeToBool )
42 import Outputable ( isAvarop, isPreludeDefined, getOrigName,
43 ifPprShowAll, interpp'SP
45 import PprStyle ( PprStyle(..), codeStyle, showUserishTypes )
47 import TysWiredIn ( listTyCon )
48 import Unique ( pprUnique10, pprUnique )
49 import Usage ( UVar(..), pprUVar )
54 instance (Eq tyvar, Outputable tyvar,
55 Eq uvar, Outputable uvar ) => Outputable (GenType tyvar uvar) where
56 ppr sty ty = pprGenType sty ty
58 instance Outputable TyCon where
59 ppr sty tycon = pprTyCon sty tycon
61 instance Outputable (GenClass tyvar uvar) where
62 -- we use pprIfaceClass for printing in interfaces
63 ppr sty (Class u n _ _ _ _ _ _ _ _) = ppr sty n
65 instance Outputable ty => Outputable (GenClassOp ty) where
66 ppr sty clsop = pprGenClassOp sty clsop
68 instance Outputable (GenTyVar flexi) where
69 ppr sty tv = pprGenTyVar sty tv
71 -- and two SPECIALIZEd ones:
72 instance Outputable {-Type, i.e.:-}(GenType TyVar UVar) where
73 ppr sty ty = pprGenType sty ty
75 instance Outputable {-TyVar, i.e.:-}(GenTyVar Usage) where
76 ppr sty ty = pprGenTyVar sty ty
79 %************************************************************************
81 \subsection[Type]{@Type@}
83 %************************************************************************
85 @pprGenType@ is the std @Type@ printer; the overloaded @ppr@ function is
86 defined to use this. @pprParendGenType@ is the same, except it puts
87 parens around the type, except for the atomic cases. @pprParendGenType@
88 works just by setting the initial context precedence very high.
91 pprGenType, pprParendGenType :: (Eq tyvar, Outputable tyvar, Eq uvar, Outputable uvar)
92 => PprStyle -> GenType tyvar uvar -> Pretty
94 pprGenType sty ty = ppr_ty sty (initial_ve sty) tOP_PREC ty
95 pprParendGenType sty ty = ppr_ty sty (initial_ve sty) tYCON_PREC ty
97 pprType sty ty = ppr_ty sty (initial_ve sty) tOP_PREC (ty :: Type)
98 pprParendType sty ty = ppr_ty sty (initial_ve sty) tYCON_PREC (ty :: Type)
100 pprMaybeTy :: (Eq tyvar, Outputable tyvar, Eq uvar, Outputable uvar)
101 => PprStyle -> Maybe (GenType tyvar uvar) -> Pretty
102 pprMaybeTy sty Nothing = ppChar '*'
103 pprMaybeTy sty (Just ty) = pprParendGenType sty ty
107 ppr_ty :: (Eq tyvar, Outputable tyvar, Eq uvar, Outputable uvar)
108 => PprStyle -> VarEnv tyvar uvar -> Int
109 -> GenType tyvar uvar
112 ppr_ty sty env ctxt_prec (TyVarTy tyvar)
113 = ppr_tyvar env tyvar
115 ppr_ty sty env ctxt_prec (TyConTy tycon usage)
118 ppr_ty sty env ctxt_prec ty@(ForAllTy _ _)
119 | showUserishTypes sty = ppr_ty sty env' ctxt_prec body_ty
121 | otherwise = ppSep [ ppPStr SLIT("_forall_"),
122 ppIntersperse pp'SP pp_tyvars,
124 ppr_ty sty env' ctxt_prec body_ty
127 (tyvars, body_ty) = splitForAllTy ty
128 env' = foldl add_tyvar env tyvars
129 pp_tyvars = map (ppr_tyvar env') tyvars
131 ppr_ty sty env ctxt_prec (ForAllUsageTy uv uvs ty)
132 = panic "ppr_ty:ForAllUsageTy"
134 ppr_ty sty env ctxt_prec ty@(FunTy (DictTy _ _ _) _ _)
135 | showUserishTypes sty
136 -- Print a nice looking context (Eq a, Text b) => ...
137 = ppSep [ppBesides [ppLparen,
138 ppIntersperse pp'SP (map (ppr_dict sty env tOP_PREC) theta),
141 ppr_ty sty env ctxt_prec body_ty
144 (theta, body_ty) = splitRhoTy ty
146 ppr_ty sty env ctxt_prec (FunTy ty1 ty2 usage)
147 -- We fiddle the precedences passed to left/right branches,
148 -- so that right associativity comes out nicely...
149 = maybeParen ctxt_prec fUN_PREC
150 (ppCat [ppr_ty sty env fUN_PREC ty1,
152 ppr_ty sty env tOP_PREC ty2])
154 ppr_ty sty env ctxt_prec ty@(AppTy _ _)
155 = ppr_corner sty env ctxt_prec fun_ty arg_tys
157 (fun_ty, arg_tys) = splitAppTy ty
159 ppr_ty PprInterface env ctxt_prec (SynTy tycon tys expansion)
160 -- always expand types in an interface
161 = ppr_ty PprInterface env ctxt_prec expansion
163 ppr_ty sty env ctxt_prec (SynTy tycon tys expansion)
165 (ppr_app sty env ctxt_prec (ppr sty tycon) tys)
166 (ifPprShowAll sty (ppCat [ppStr " {- expansion:",
167 ppr_ty sty env tOP_PREC expansion,
170 ppr_ty sty env ctxt_prec (DictTy clas ty usage)
171 = ppr_dict sty env ctxt_prec (clas, ty)
174 -- Some help functions
175 ppr_corner sty env ctxt_prec (TyConTy FunTyCon usage) arg_tys
176 = ASSERT(length arg_tys == 2)
177 ppr_ty sty env ctxt_prec (FunTy ty1 ty2 usage)
179 (ty1:ty2:_) = arg_tys
181 ppr_corner sty env ctxt_prec (TyConTy (TupleTyCon a) usage) arg_tys
182 = ASSERT(length arg_tys == a)
183 ppBesides [ppLparen, arg_tys_w_commas, ppRparen]
185 arg_tys_w_commas = ppIntersperse pp'SP (map (ppr_ty sty env tOP_PREC) arg_tys)
187 ppr_corner sty env ctxt_prec (TyConTy tycon usage) arg_tys
189 = ASSERT(length arg_tys == 1)
190 ppBesides [ppLbrack, ppr_ty sty env tOP_PREC ty1, ppRbrack]
194 ppr_corner sty env ctxt_prec (TyConTy tycon usage) arg_tys
195 = ppr_app sty env ctxt_prec (ppr sty tycon) arg_tys
197 ppr_corner sty env ctxt_prec (TyVarTy tyvar) arg_tys
198 = ppr_app sty env ctxt_prec (ppr_tyvar env tyvar) arg_tys
201 ppr_app sty env ctxt_prec pp_fun []
203 ppr_app sty env ctxt_prec pp_fun arg_tys
204 = maybeParen ctxt_prec tYCON_PREC (ppCat [pp_fun, arg_tys_w_spaces])
206 arg_tys_w_spaces = ppIntersperse ppSP (map (ppr_ty sty env tYCON_PREC) arg_tys)
209 ppr_dict sty env ctxt_prec (clas, ty)
210 = maybeParen ctxt_prec tYCON_PREC
211 (ppCat [ppr sty clas, ppr_ty sty env tYCON_PREC ty])
214 Nota Bene: we must assign print-names to the forall'd type variables
215 alphabetically, with the first forall'd variable having the alphabetically
216 first name. Reason: so anyone reading the type signature printed without
217 explicit forall's will be able to reconstruct them in the right order.
220 -- Entirely local to this module
221 data VarEnv tyvar uvar
222 = VE [Pretty] -- Tyvar pretty names
223 (tyvar -> Pretty) -- Tyvar lookup function
224 [Pretty] -- Uvar pretty names
225 (uvar -> Pretty) -- Uvar lookup function
227 initial_ve PprForC = VE [] (\tv -> ppChar '*')
228 [] (\tv -> ppChar '#')
230 initial_ve sty = VE tv_pretties (ppr sty)
231 uv_pretties (ppr sty)
233 tv_pretties = map (\ c -> ppChar c ) ['a' .. 'h']
235 map (\ n -> ppBeside (ppChar 'a') (ppInt n))
236 ([0 .. ] :: [Int]) -- a0 ... aN
238 uv_pretties = map (\ c -> ppChar c ) ['u' .. 'y']
240 map (\ n -> ppBeside (ppChar 'u') (ppInt n))
241 ([0 .. ] :: [Int]) -- u0 ... uN
244 ppr_tyvar (VE _ ppr _ _) tyvar = ppr tyvar
245 ppr_uvar (VE _ _ _ ppr) uvar = ppr uvar
247 add_tyvar ve@(VE [] _ _ _) tyvar = ve
248 add_tyvar (VE (tv_pp:tv_supply') tv_ppr uv_supply uv_ppr) tyvar
249 = VE tv_supply' tv_ppr' uv_supply uv_ppr
251 tv_ppr' tv | tv==tyvar = tv_pp
252 | otherwise = tv_ppr tv
254 add_uvar ve@(VE _ _ [] _) uvar = ve
255 add_uvar (VE tv_supply tv_ppr (uv_pp:uv_supply') uv_ppr) uvar
256 = VE tv_supply tv_ppr uv_supply' uv_ppr'
258 uv_ppr' uv | uv==uvar = uv_pp
259 | otherwise = uv_ppr uv
262 @ppr_ty@ takes an @Int@ that is the precedence of the context.
263 The precedence levels are:
265 \item[0:] What we start with.
266 \item[1:] Function application (@FunTys@).
267 \item[2:] Type constructors.
272 tOP_PREC = (0 :: Int)
273 fUN_PREC = (1 :: Int)
274 tYCON_PREC = (2 :: Int)
276 maybeParen ctxt_prec inner_prec pretty
277 | ctxt_prec < inner_prec = pretty
278 | otherwise = ppParens pretty
281 %************************************************************************
283 \subsection[TyVar]{@TyVar@}
285 %************************************************************************
288 pprGenTyVar sty (TyVar uniq kind name usage)
289 = ppBesides [pp_name, pprUnique10 uniq]
291 pp_name = case name of
293 Nothing -> case kind of
294 TypeKind -> ppChar 'o'
295 BoxedTypeKind -> ppChar 't'
296 UnboxedTypeKind -> ppChar 'u'
297 ArrowKind _ _ -> ppChar 'a'
300 %************************************************************************
302 \subsection[TyCon]{@TyCon@}
304 %************************************************************************
306 ToDo; all this is suspiciously like getOccName!
309 showTyCon :: PprStyle -> TyCon -> String
310 showTyCon sty tycon = ppShow 80 (pprTyCon sty tycon)
312 pprTyCon :: PprStyle -> TyCon -> Pretty
314 pprTyCon sty FunTyCon = ppStr "(->)"
315 pprTyCon sty (TupleTyCon arity) = ppBeside (ppPStr SLIT("Tuple")) (ppInt arity)
316 pprTyCon sty (PrimTyCon uniq name kind) = ppr sty name
318 pprTyCon sty tycon@(DataTyCon uniq name kind tyvars ctxt cons derivings nd)
320 PprDebug -> pp_tycon_and_uniq
321 PprShowAll -> pp_tycon_and_uniq
324 pp_tycon_and_uniq = ppBesides [pp_tycon, ppChar '.', pprUnique uniq]
325 pp_tycon = ppr sty name
327 pprTyCon sty (SpecTyCon tc ty_maybes)
328 = ppBeside (pprTyCon sty tc)
330 then identToC tys_stuff
331 else ppPStr tys_stuff)
333 tys_stuff = specMaybeTysSuffix ty_maybes
335 pprTyCon sty (SynTyCon uniq name kind arity tyvars expansion)
336 = ppBeside (ppr sty name)
338 (ppCat [ ppStr " {-",
340 interpp'SP sty tyvars,
341 pprParendGenType sty expansion,
346 %************************************************************************
348 \subsection[Class]{@Class@}
350 %************************************************************************
353 pprGenClassOp :: Outputable ty => PprStyle -> GenClassOp ty -> Pretty
355 pprGenClassOp sty op = ppr_class_op sty [] op
357 ppr_class_op sty tyvars (ClassOp op_name i ty)
360 PprForAsm _ _ -> pp_C
361 PprInterface -> ppCat [pp_user, ppPStr SLIT("::"), ppr sty ty]
362 PprShowAll -> ppCat [pp_user, ppPStr SLIT("::"), ppr sty ty]
365 pp_C = ppPStr op_name
366 pp_user = if isAvarop op_name
367 then ppBesides [ppLparen, pp_C, ppRparen]
372 %************************************************************************
374 \subsection[]{Mumbo jumbo}
376 %************************************************************************
379 -- Shallowly magical; converts a type into something
380 -- vaguely close to what can be used in C identifier.
381 -- Don't forget to include the module name!!!
382 getTypeString :: Type -> [FAST_STRING]
384 | is_prelude_ty = [string]
385 | otherwise = [mod, string]
387 string = _PK_ (tidy (ppShow 1000 ppr_t))
388 ppr_t = pprGenType PprForC ty
389 -- PprForC expands type synonyms as it goes
392 = case (maybeAppTyCon ty) of
393 Nothing -> true_bottom
395 if isPreludeDefined tycon
397 else (False, fst (getOrigName tycon))
399 true_bottom = (True, panic "getTypeString")
401 --------------------------------------------------
408 '-' : '>' : xs -> '-' : '>' : tidy (no_leading_sps xs)
409 other -> ' ' : tidy more
411 tidy (',' : more) = ',' : tidy (no_leading_sps more)
413 tidy (x : xs) = x : tidy xs -- catch all
415 no_leading_sps [] = []
416 no_leading_sps (' ':xs) = no_leading_sps xs
417 no_leading_sps other = other
419 typeMaybeString :: Maybe Type -> [FAST_STRING]
420 typeMaybeString Nothing = [SLIT("!")]
421 typeMaybeString (Just t) = getTypeString t
423 specMaybeTysSuffix :: [Maybe Type] -> FAST_STRING
424 specMaybeTysSuffix ty_maybes
426 ty_strs = concat (map typeMaybeString ty_maybes)
427 dotted_tys = [ _CONS_ '.' str | str <- ty_strs ]
432 ========================================================
433 INTERFACE STUFF; move it out
437 pprTyCon sty@PprInterface (SynonymTyCon k n a vs exp unabstract) specs
438 = ASSERT (null specs)
440 lookup_fn = mk_lookup_tyvar_fn sty vs
441 pp_tyvars = map lookup_fn vs
443 ppCat [ppPStr SLIT("type"), ppr sty n, ppIntersperse ppSP pp_tyvars,
444 ppEquals, ppr_ty sty lookup_fn tOP_PREC exp]
446 pprTyCon sty@PprInterface this_tycon@(DataTyCon u n k vs ctxt cons derivings data_or_new) specs
447 = ppHang (ppCat [pp_data_or_new,
450 ppIntersperse ppSP (map lookup_fn vs)])
452 (ppCat [pp_unabstract_condecls,
454 -- NB: we do not print deriving info in interfaces
456 lookup_fn = mk_lookup_tyvar_fn sty vs
458 pp_data_or_new = case data_or_new of
459 DataType -> ppPStr SLIT("data")
460 NewType -> ppPStr SLIT("newtype")
462 yes_we_print_condecls
464 && not (null cons) -- we know what they are
465 && (case (getExportFlag n) of
469 yes_we_print_pragma_condecls
470 = not yes_we_print_condecls
471 && not opt_OmitInterfacePragmas
473 && not (maybeToBool (maybePurelyLocalTyCon this_tycon))
474 {- && not (any (dataConMentionsNonPreludeTyCon this_tycon) cons) -}
476 yes_we_print_pragma_specs
479 pp_unabstract_condecls
480 = if yes_we_print_condecls
481 then ppCat [ppSP, ppEquals, pp_condecls]
485 = if yes_we_print_pragma_condecls
490 = if yes_we_print_pragma_specs
495 = if (yes_we_print_pragma_condecls || yes_we_print_pragma_specs)
496 then ppCat [ppStr "\t{-# GHC_PRAGMA", pp_pragma_condecls, pp_pragma_specs, ppStr "#-}"]
503 ppCat ((ppr_con c) : (map ppr_next_con cs))
507 (_, _, con_arg_tys, _) = dataConSig con
509 ppCat [pprNonOp PprForUser con, -- the data con's name...
510 ppIntersperse ppSP (map (ppr_ty sty lookup_fn tYCON_PREC) con_arg_tys)]
512 ppr_next_con con = ppCat [ppChar '|', ppr_con con]
515 = ppBesides [ppPStr SLIT("_SPECIALIZE_ "), pp_the_list [
516 ppCat [ppLbrack, ppInterleave ppComma (map pp_maybe ty_maybes), ppRbrack]
517 | ty_maybes <- specs ]]
520 pp_the_list (p:ps) = ppAbove (ppBeside p ppComma) (pp_the_list ps)
522 pp_maybe Nothing = pp_NONE
523 pp_maybe (Just ty) = pprParendGenType sty ty
525 pp_NONE = ppPStr SLIT("_N_")
527 pprTyCon PprInterface (TupleTyCon a) specs
528 = ASSERT (null specs)
529 ppCat [ ppStr "{- Tuple", ppInt a, ppStr "-}" ]
531 pprTyCon PprInterface (PrimTyCon k n a kind_fn) specs
532 = ASSERT (null specs)
533 ppCat [ ppStr "{- data", ppr PprForUser n, ppStr " *built-in* -}" ]
539 pprIfaceClass :: (Id -> Id) -> IdEnv UnfoldingDetails -> Class -> Pretty
541 pprIfaceClass better_id_fn inline_env
542 (Class k n tyvar super_classes sdsels ops sels defms insts links)
544 sdsel_infos = map (getIdInfo . better_id_fn) sdsels
546 ppAboves [ ppCat [ppPStr SLIT("class"), ppr_theta tyvar super_classes,
547 ppr sty n, lookup_fn tyvar,
549 || opt_OmitInterfacePragmas
550 || (any boringIdInfo sdsel_infos)
551 -- ToDo: really should be "all bor..."
552 -- but then parsing is more tedious,
553 -- and this is really as good in practice.
555 else pp_sdsel_pragmas (sdsels `zip` sdsel_infos),
558 else ppPStr SLIT("where")],
560 [ ppr_op op (better_id_fn sel) (better_id_fn defm)
561 | (op,sel,defm) <- zip3 ops sels defms]) ]
563 lookup_fn = mk_lookup_tyvar_fn sty [tyvar]
565 ppr_theta :: TyVar -> [Class] -> Pretty
566 ppr_theta tv [] = ppNil
567 ppr_theta tv super_classes
568 = ppBesides [ppLparen,
569 ppIntersperse pp'SP{-'-} (map ppr_assert super_classes),
572 ppr_assert (Class _ n _ _ _ _ _ _ _ _) = ppCat [ppr sty n, lookup_fn tv]
574 pp_sdsel_pragmas sdsels_and_infos
575 = ppCat [ppStr "{-# GHC_PRAGMA {-superdicts-}",
576 ppIntersperse pp'SP{-'-}
577 [ppIdInfo sty sdsel False{-NO specs-} better_id_fn inline_env info
578 | (sdsel, info) <- sdsels_and_infos ],
581 ppr_op op opsel_id defm_id
583 stuff = ppBeside (ppChar '\t') (ppr_class_op sty [tyvar] op)
585 if opt_OmitInterfacePragmas
588 (ppCat [ppStr "\t {-# GHC_PRAGMA", ppAbove pp_opsel pp_defm, ppStr "#-}"])
590 pp_opsel = ppCat [ppPStr SLIT("{-meth-}"), ppIdInfo sty opsel_id False{-no specs-} better_id_fn inline_env (getIdInfo opsel_id)]
591 pp_defm = ppCat [ppPStr SLIT("\t\t{-defm-}"), ppIdInfo sty defm_id False{-no specs-} better_id_fn inline_env (getIdInfo defm_id)]