2 % (c) The AQUA Project, Glasgow University, 1996
4 %************************************************************************
6 \section[PprCore]{Printing of Core syntax, including for interfaces}
8 %************************************************************************
11 #include "HsVersions.h"
19 -- these are here to make the instances go in 0.26:
20 #if __GLASGOW_HASKELL__ <= 30
21 , GenCoreBinding, GenCoreExpr, GenCoreCaseAlts
22 , GenCoreCaseDefault, GenCoreArg
29 import CostCentre ( showCostCentre )
30 import Id ( idType, getIdInfo, getIdStrictness, isTupleCon,
31 nullIdEnv, SYN_IE(DataCon), GenId{-instances-}
33 import IdInfo ( ppIdInfo, StrictnessInfo(..) )
34 import IdLoop ( Unfolding ) -- Needed by IdInfo.hi?
35 import Literal ( Literal{-instances-} )
36 import Name ( isSymLexeme )
37 import Outputable -- quite a few things
39 import PprType ( pprParendGenType, GenType{-instances-}, GenTyVar{-instance-} )
40 import PprStyle ( PprStyle(..) )
42 import PrimOp ( PrimOp{-instances-} )
43 import TyVar ( GenTyVar{-instances-} )
44 import Unique ( Unique{-instances-} )
45 import Usage ( GenUsage{-instances-} )
46 import Util ( panic{-ToDo:rm-} )
49 %************************************************************************
51 \subsection{Public interfaces for Core printing (excluding instances)}
53 %************************************************************************
55 @pprCoreBinding@ and @pprCoreExpr@ let you give special printing
56 function for ``major'' val_bdrs (those next to equal signs :-),
57 ``minor'' ones (lambda-bound, case-bound), and bindees. They would
58 usually be called through some intermediary.
60 The binder/occ printers take the default ``homogenized'' (see
61 @PprEnv@...) @Pretty@ and the binder/occ. They can either use the
62 homogenized one, or they can ignore it completely. In other words,
63 the things passed in act as ``hooks'', getting the last word on how to
66 @pprParendCoreExpr@ puts parens around non-atomic Core expressions.
69 pprCoreBinding :: PprStyle -> CoreBinding -> Pretty
72 :: (Eq tyvar, Outputable tyvar,
73 Eq uvar, Outputable uvar,
77 -> (bndr -> Pretty) -- to print "major" val_bdrs
78 -> (bndr -> Pretty) -- to print "minor" val_bdrs
79 -> (occ -> Pretty) -- to print bindees
80 -> GenCoreBinding bndr occ tyvar uvar
83 pprGenCoreBinding sty pbdr1 pbdr2 pocc bind
84 = ppr_bind (init_ppr_env sty pbdr1 pbdr2 pocc) bind
86 init_ppr_env sty pbdr1 pbdr2 pocc
88 (Just (ppr sty)) -- literals
89 (Just (ppr sty)) -- data cons
90 (Just (ppr sty)) -- primops
91 (Just (\ cc -> ppStr (showCostCentre sty True cc)))
92 (Just (ppr sty)) -- tyvars
93 (Just (ppr sty)) -- usage vars
94 (Just pbdr1) (Just pbdr2) (Just pocc) -- value vars
95 (Just (pprParendGenType sty)) -- types
96 (Just (ppr sty)) -- usages
99 pprCoreBinding sty (NonRec binder expr)
100 = ppHang (ppCat [pprBigCoreBinder sty binder, ppEquals])
101 4 (pprCoreExpr sty (pprBigCoreBinder sty) (pprBabyCoreBinder sty) (ppr sty) expr)
103 pprCoreBinding sty (Rec binds)
104 = ppAboves [ifPprDebug sty (ppStr "{- plain Rec -}"),
105 ppAboves (map ppr_bind binds),
106 ifPprDebug sty (ppStr "{- end plain Rec -}")]
108 ppr_bind (binder, expr)
109 = ppHang (ppCat [pprBigCoreBinder sty binder, ppEquals])
110 4 (pprCoreExpr sty (pprBigCoreBinder sty) (pprBabyCoreBinder sty) (ppr sty) expr)
116 -> (Id -> Pretty) -- to print "major" val_bdrs
117 -> (Id -> Pretty) -- to print "minor" val_bdrs
118 -> (Id -> Pretty) -- to print bindees
121 pprCoreExpr = pprGenCoreExpr
123 pprGenCoreExpr, pprParendCoreExpr
124 :: (Eq tyvar, Outputable tyvar, Eq uvar, Outputable uvar,
128 -> (bndr -> Pretty) -- to print "major" val_bdrs
129 -> (bndr -> Pretty) -- to print "minor" val_bdrs
130 -> (occ -> Pretty) -- to print bindees
131 -> GenCoreExpr bndr occ tyvar uvar
134 pprGenCoreExpr sty pbdr1 pbdr2 pocc expr
135 = ppr_expr (init_ppr_env sty pbdr1 pbdr2 pocc) expr
137 pprParendCoreExpr sty pbdr1 pbdr2 pocc expr
141 Var _ -> id -- leave unchanged
143 _ -> ppParens -- wraps in parens
145 parenify (pprGenCoreExpr sty pbdr1 pbdr2 pocc expr)
147 ppr_core_arg sty pocc arg
148 = ppr_arg (init_ppr_env sty pocc pocc pocc) arg
150 ppr_core_alts sty pbdr1 pbdr2 pocc alts
151 = ppr_alts (init_ppr_env sty pbdr1 pbdr2 pocc) alts
153 ppr_core_default sty pbdr1 pbdr2 pocc deflt
154 = ppr_default (init_ppr_env sty pbdr1 pbdr2 pocc) deflt
157 %************************************************************************
159 \subsection{Instance declarations for Core printing}
161 %************************************************************************
165 (Outputable bndr, Outputable occ, Eq tyvar, Outputable tyvar,
166 Eq uvar, Outputable uvar)
168 Outputable (GenCoreBinding bndr occ tyvar uvar) where
169 ppr sty bind = pprGenCoreBinding sty (ppr sty) (ppr sty) (ppr sty) bind
172 (Outputable bndr, Outputable occ, Eq tyvar, Outputable tyvar,
173 Eq uvar, Outputable uvar)
175 Outputable (GenCoreExpr bndr occ tyvar uvar) where
176 ppr sty expr = pprGenCoreExpr sty (ppr sty) (ppr sty) (ppr sty) expr
179 (Outputable occ, Eq tyvar, Outputable tyvar, Eq uvar, Outputable uvar)
181 Outputable (GenCoreArg occ tyvar uvar) where
182 ppr sty arg = ppr_core_arg sty (ppr sty) arg
185 (Outputable bndr, Outputable occ, Eq tyvar, Outputable tyvar,
186 Eq uvar, Outputable uvar)
188 Outputable (GenCoreCaseAlts bndr occ tyvar uvar) where
189 ppr sty alts = ppr_core_alts sty (ppr sty) (ppr sty) (ppr sty) alts
192 (Outputable bndr, Outputable occ, Eq tyvar, Outputable tyvar,
193 Eq uvar, Outputable uvar)
195 Outputable (GenCoreCaseDefault bndr occ tyvar uvar) where
196 ppr sty deflt = ppr_core_default sty (ppr sty) (ppr sty) (ppr sty) deflt
199 %************************************************************************
201 \subsection{Workhorse routines (...????...)}
203 %************************************************************************
206 ppr_bind pe (NonRec val_bdr expr)
207 = ppHang (ppCat [pMajBndr pe val_bdr, ppEquals])
210 ppr_bind pe (Rec binds)
211 = ppAboves [ ppStr "{- Rec -}",
212 ppAboves (map ppr_pair binds),
213 ppStr "{- end Rec -}" ]
215 ppr_pair (val_bdr, expr)
216 = ppHang (ppCat [pMajBndr pe val_bdr, ppEquals])
221 ppr_parend_expr pe expr
225 Var _ -> id -- leave unchanged
227 _ -> ppParens -- wraps in parens
229 parenify (ppr_expr pe expr)
233 ppr_expr pe (Var name) = pOcc pe name
234 ppr_expr pe (Lit lit) = pLit pe lit
235 ppr_expr pe (Con con []) = pCon pe con
237 ppr_expr pe (Con con args)
238 = ppHang (ppBesides [pCon pe con, ppChar '!'])
239 4 (ppSep (map (ppr_arg pe) args))
241 ppr_expr pe (Prim prim args)
242 = ppHang (ppBesides [pPrim pe prim, ppChar '!'])
243 4 (ppSep (map (ppr_arg pe) args))
245 ppr_expr pe expr@(Lam _ _)
247 (uvars, tyvars, vars, body) = collectBinders expr
249 ppHang (ppCat [pp_vars SLIT("_/u\\_") (pUVar pe) uvars,
250 pp_vars SLIT("_/\\_") (pTyVar pe) tyvars,
251 pp_vars SLIT("\\") (pMinBndr pe) vars])
254 pp_vars lam pp [] = ppNil
256 = ppCat [ppPStr lam, ppInterleave ppSP (map pp vs), ppStr "->"]
258 ppr_expr pe expr@(App _ _)
260 (fun, uargs, targs, vargs) = collectArgs expr
262 ppHang (ppr_parend_expr pe fun)
263 4 (ppSep [ ppInterleave ppNil (map (pUse pe) uargs)
264 , ppInterleave ppNil (map (pTy pe) targs)
265 , ppInterleave ppNil (map (ppr_arg pe) vargs)
268 ppr_expr pe (Case expr alts)
270 -- johan thinks that single case patterns should be on same line as case,
271 -- and no indent; all sane persons agree with him.
273 ppr_alt (AlgAlts [] (BindDefault n _)) = ppBeside (pMinBndr pe n) (ppStr " ->")
274 ppr_alt (PrimAlts [] (BindDefault n _)) = ppBeside (pMinBndr pe n) (ppStr " ->")
275 ppr_alt (PrimAlts ((l, _):[]) NoDefault)= ppBeside (pLit pe l) (ppStr " ->")
276 ppr_alt (AlgAlts ((con, params, _):[]) NoDefault)
277 = ppCat [ppr_alt_con con (pCon pe con),
278 ppInterleave ppSP (map (pMinBndr pe) params),
281 ppr_rhs (AlgAlts [] (BindDefault _ expr)) = ppr_expr pe expr
282 ppr_rhs (AlgAlts ((_,_,expr):[]) NoDefault) = ppr_expr pe expr
283 ppr_rhs (PrimAlts [] (BindDefault _ expr)) = ppr_expr pe expr
284 ppr_rhs (PrimAlts ((_,expr):[]) NoDefault) = ppr_expr pe expr
287 [ppSep [ppPStr SLIT("case"), ppNest 4 (ppr_parend_expr pe expr), ppStr "of {", ppr_alt alts],
288 ppBeside (ppr_rhs alts) (ppStr "}")]
290 | otherwise -- default "case" printing
292 [ppSep [ppPStr SLIT("case"), ppNest 4 (ppr_parend_expr pe expr), ppStr "of {"],
293 ppNest 2 (ppr_alts pe alts),
296 -- special cases: let ... in let ...
297 -- ("disgusting" SLPJ)
299 ppr_expr pe (Let bind@(NonRec val_bdr rhs@(Let _ _)) body)
301 ppCat [ppStr "let {", pMajBndr pe val_bdr, ppEquals],
302 ppNest 2 (ppr_expr pe rhs),
306 ppr_expr pe (Let bind@(NonRec val_bdr rhs) expr@(Let _ _))
308 (ppHang (ppStr "let {")
309 2 (ppCat [ppHang (ppCat [pMajBndr pe val_bdr, ppEquals])
314 -- general case (recursive case, too)
315 ppr_expr pe (Let bind expr)
316 = ppSep [ppHang (ppStr "let {") 2 (ppr_bind pe bind),
317 ppHang (ppStr "} in ") 2 (ppr_expr pe expr)]
319 ppr_expr pe (SCC cc expr)
320 = ppSep [ppCat [ppPStr SLIT("_scc_"), pSCC pe cc],
321 ppr_parend_expr pe expr ]
323 ppr_expr pe (Coerce c ty expr)
324 = ppSep [ppCat [ppPStr SLIT("_coerce_"), pp_coerce c],
325 pTy pe ty, ppr_parend_expr pe expr ]
327 pp_coerce (CoerceIn v) = ppBeside (ppStr "{-in-}") (ppr (pStyle pe) v)
328 pp_coerce (CoerceOut v) = ppBeside (ppStr "{-out-}") (ppr (pStyle pe) v)
330 only_one_alt (AlgAlts [] (BindDefault _ _)) = True
331 only_one_alt (AlgAlts (_:[]) NoDefault) = True
332 only_one_alt (PrimAlts [] (BindDefault _ _)) = True
333 only_one_alt (PrimAlts (_:[]) NoDefault) = True
334 only_one_alt _ = False
336 ppr_alt_con con pp_con
337 = if isSymLexeme con then ppParens pp_con else pp_con
341 ppr_alts pe (AlgAlts alts deflt)
342 = ppAboves [ ppAboves (map ppr_alt alts), ppr_default pe deflt ]
344 ppr_alt (con, params, expr)
345 = ppHang (if isTupleCon con then
346 ppCat [ppParens (ppInterleave ppComma (map (pMinBndr pe) params)),
349 ppCat [ppr_alt_con con (pCon pe con),
350 ppInterleave ppSP (map (pMinBndr pe) params),
355 ppr_alts pe (PrimAlts alts deflt)
356 = ppAboves [ ppAboves (map ppr_alt alts), ppr_default pe deflt ]
359 = ppHang (ppCat [pLit pe lit, ppStr "->"])
364 ppr_default pe NoDefault = ppNil
366 ppr_default pe (BindDefault val_bdr expr)
367 = ppHang (ppCat [pMinBndr pe val_bdr, ppStr "->"])
372 ppr_arg pe (LitArg lit) = pLit pe lit
373 ppr_arg pe (VarArg v) = pOcc pe v
374 ppr_arg pe (TyArg ty) = pTy pe ty
375 ppr_arg pe (UsageArg use) = pUse pe use
378 Other printing bits-and-bobs used with the general @pprCoreBinding@
379 and @pprCoreExpr@ functions.
382 pprBigCoreBinder sty binder
383 = ppAboves [sig, pragmas, ppr sty binder]
385 sig = ifnotPprShowAll sty (
386 ppHang (ppCat [ppr sty binder, ppStr "::"])
387 4 (ppr sty (idType binder)))
391 (ppIdInfo sty binder False{-no specs, thanks-} id nullIdEnv
394 pprBabyCoreBinder sty binder
395 = ppCat [ppr sty binder, pp_strictness]
398 = case (getIdStrictness binder) of
399 NoStrictnessInfo -> ppNil
400 BottomGuaranteed -> ppStr "{- _!_ -}"
401 StrictnessInfo xx _ ->
402 panic "PprCore:pp_strictness:StrictnessInfo:ToDo"
403 -- ppStr ("{- " ++ (showList xx "") ++ " -}")
405 pprTypedCoreBinder sty binder
406 = ppBesides [ppLparen, ppCat [ppr sty binder,
407 ppStr "::", ppr sty (idType binder)],