-pprExpr sty (HsLet binds expr@(HsLet _ _))
- = sep [hang (ptext SLIT("let")) 2 (hsep [ppr sty binds, ptext SLIT("in")]),
- ppr sty expr]
-
-pprExpr sty (HsLet binds expr)
- = sep [hang (ptext SLIT("let")) 2 (ppr sty binds),
- hang (ptext SLIT("in")) 2 (ppr sty expr)]
-
-pprExpr sty (HsDo do_or_list_comp stmts _) = pprDo do_or_list_comp sty stmts
-pprExpr sty (HsDoOut do_or_list_comp stmts _ _ _ _ _) = pprDo do_or_list_comp sty stmts
-
-pprExpr sty (ExplicitList exprs)
- = brackets (fsep (punctuate comma (map (pprExpr sty) exprs)))
-pprExpr sty (ExplicitListOut ty exprs)
- = hcat [ brackets (fsep (punctuate comma (map (pprExpr sty) exprs))),
- ifnotPprForUser sty ((<>) space (parens (pprGenType sty ty))) ]
-
-pprExpr sty (ExplicitTuple exprs)
- = parens (sep (punctuate comma (map (pprExpr sty) exprs)))
-
-pprExpr sty (RecordCon con rbinds)
- = pp_rbinds sty (ppr sty con) rbinds
-
-pprExpr sty (RecordUpd aexp rbinds)
- = pp_rbinds sty (pprParendExpr sty aexp) rbinds
-pprExpr sty (RecordUpdOut aexp _ _ rbinds)
- = pp_rbinds sty (pprParendExpr sty aexp) rbinds
-
-pprExpr sty (ExprWithTySig expr sig)
- = hang ((<>) (nest 2 (pprExpr sty expr)) (ptext SLIT(" ::")))
- 4 (ppr sty sig)
-
-pprExpr sty (ArithSeqIn info)
- = brackets (ppr sty info)
-pprExpr sty (ArithSeqOut expr info)
- | userStyle sty = brackets (ppr sty info)
- | otherwise = brackets (hcat [parens (ppr sty expr), space, ppr sty info])
-
-pprExpr sty (CCall fun args _ is_asm result_ty)
- = hang (if is_asm
- then hcat [ptext SLIT("_casm_ ``"), ptext fun, ptext SLIT("''")]
- else (<>) (ptext SLIT("_ccall_ ")) (ptext fun))
- 4 (sep (map (pprParendExpr sty) args))
-
-pprExpr sty (HsSCC label expr)
- = sep [ (<>) (ptext SLIT("_scc_ ")) (hcat [char '"', ptext label, char '"']),
- pprParendExpr sty expr ]
-
-pprExpr sty (TyLam tyvars expr)
- = hang (hsep [ptext SLIT("/\\"), interppSP sty tyvars, ptext SLIT("->")])
- 4 (pprExpr sty expr)
-
-pprExpr sty (TyApp expr [ty])
- = hang (pprExpr sty expr) 4 (pprParendGenType sty ty)
-
-pprExpr sty (TyApp expr tys)
- = hang (pprExpr sty expr)
- 4 (brackets (interpp'SP sty tys))
-
-pprExpr sty (DictLam dictvars expr)
- = hang (hsep [ptext SLIT("\\{-dict-}"), interppSP sty dictvars, ptext SLIT("->")])
- 4 (pprExpr sty expr)
-
-pprExpr sty (DictApp expr [dname])
- = hang (pprExpr sty expr) 4 (ppr sty dname)
-
-pprExpr sty (DictApp expr dnames)
- = hang (pprExpr sty expr)
- 4 (brackets (interpp'SP sty dnames))
-
-pprExpr sty (ClassDictLam dicts methods expr)
- = hang (hsep [ptext SLIT("\\{-classdict-}"),
- brackets (interppSP sty dicts),
- brackets (interppSP sty methods),
- ptext SLIT("->")])
- 4 (pprExpr sty expr)
-
-pprExpr sty (Dictionary dicts methods)
- = parens (sep [ptext SLIT("{-dict-}"),
- brackets (interpp'SP sty dicts),
- brackets (interpp'SP sty methods)])
-
-pprExpr sty (SingleDict dname)
- = hsep [ptext SLIT("{-singleDict-}"), ppr sty dname]
-
+ppr_expr (HsLet binds expr@(L _ (HsLet _ _)))
+ = sep [hang (ptext SLIT("let")) 2 (hsep [pprBinds binds, ptext SLIT("in")]),
+ ppr_lexpr expr]
+
+ppr_expr (HsLet binds expr)
+ = sep [hang (ptext SLIT("let")) 2 (pprBinds binds),
+ hang (ptext SLIT("in")) 2 (ppr expr)]
+
+ppr_expr (HsDo do_or_list_comp stmts body _) = pprDo do_or_list_comp stmts body
+
+ppr_expr (ExplicitList _ exprs)
+ = brackets (fsep (punctuate comma (map ppr_lexpr exprs)))
+
+ppr_expr (ExplicitPArr _ exprs)
+ = pa_brackets (fsep (punctuate comma (map ppr_lexpr exprs)))
+
+ppr_expr (ExplicitTuple exprs boxity)
+ = tupleParens boxity (sep (punctuate comma (map ppr_lexpr exprs)))
+
+ppr_expr (RecordCon con_id con_expr rbinds)
+ = pp_rbinds (ppr con_id) rbinds
+
+ppr_expr (RecordUpd aexp rbinds _ _)
+ = pp_rbinds (pprParendExpr aexp) rbinds
+
+ppr_expr (ExprWithTySig expr sig)
+ = hang (nest 2 (ppr_lexpr expr) <+> dcolon)
+ 4 (ppr sig)
+ppr_expr (ExprWithTySigOut expr sig)
+ = hang (nest 2 (ppr_lexpr expr) <+> dcolon)
+ 4 (ppr sig)
+
+ppr_expr (ArithSeq expr info) = brackets (ppr info)
+ppr_expr (PArrSeq expr info) = pa_brackets (ppr info)
+
+ppr_expr EWildPat = char '_'
+ppr_expr (ELazyPat e) = char '~' <> pprParendExpr e
+ppr_expr (EAsPat v e) = ppr v <> char '@' <> pprParendExpr e
+
+ppr_expr (HsSCC lbl expr)
+ = sep [ ptext SLIT("_scc_") <+> doubleQuotes (ftext lbl), pprParendExpr expr ]
+
+ppr_expr (TyLam tyvars expr)
+ = hang (hsep [ptext SLIT("/\\"),
+ hsep (map (pprBndr LambdaBind) tyvars),
+ ptext SLIT("->")])
+ 4 (ppr_lexpr expr)
+
+ppr_expr (TyApp expr [ty])
+ = hang (ppr_lexpr expr) 4 (pprParendType ty)
+
+ppr_expr (TyApp expr tys)
+ = hang (ppr_lexpr expr)
+ 4 (brackets (interpp'SP tys))
+
+ppr_expr (DictLam dictvars expr)
+ = hang (hsep [ptext SLIT("\\{-dict-}"),
+ hsep (map (pprBndr LambdaBind) dictvars),
+ ptext SLIT("->")])
+ 4 (ppr_lexpr expr)
+
+ppr_expr (DictApp expr [dname])
+ = hang (ppr_lexpr expr) 4 (ppr dname)
+
+ppr_expr (DictApp expr dnames)
+ = hang (ppr_lexpr expr)
+ 4 (brackets (interpp'SP dnames))
+
+ppr_expr (HsType id) = ppr id
+
+ppr_expr (HsSpliceE s) = pprSplice s
+ppr_expr (HsBracket b) = pprHsBracket b
+ppr_expr (HsBracketOut e []) = ppr e
+ppr_expr (HsBracketOut e ps) = ppr e $$ ptext SLIT("pending") <+> ppr ps
+
+ppr_expr (HsProc pat (L _ (HsCmdTop cmd _ _ _)))
+ = hsep [ptext SLIT("proc"), ppr pat, ptext SLIT("->"), ppr cmd]
+
+ppr_expr (HsArrApp arrow arg _ HsFirstOrderApp True)
+ = hsep [ppr_lexpr arrow, ptext SLIT("-<"), ppr_lexpr arg]
+ppr_expr (HsArrApp arrow arg _ HsFirstOrderApp False)
+ = hsep [ppr_lexpr arg, ptext SLIT(">-"), ppr_lexpr arrow]
+ppr_expr (HsArrApp arrow arg _ HsHigherOrderApp True)
+ = hsep [ppr_lexpr arrow, ptext SLIT("-<<"), ppr_lexpr arg]
+ppr_expr (HsArrApp arrow arg _ HsHigherOrderApp False)
+ = hsep [ppr_lexpr arg, ptext SLIT(">>-"), ppr_lexpr arrow]
+
+ppr_expr (HsArrForm (L _ (HsVar v)) (Just _) [arg1, arg2])
+ = sep [pprCmdArg (unLoc arg1), hsep [pprInfix v, pprCmdArg (unLoc arg2)]]
+ppr_expr (HsArrForm op _ args)
+ = hang (ptext SLIT("(|") <> ppr_lexpr op)
+ 4 (sep (map (pprCmdArg.unLoc) args) <> ptext SLIT("|)"))
+
+pprCmdArg :: OutputableBndr id => HsCmdTop id -> SDoc
+pprCmdArg (HsCmdTop cmd@(L _ (HsArrForm _ Nothing [])) _ _ _)
+ = ppr_lexpr cmd
+pprCmdArg (HsCmdTop cmd _ _ _)
+ = parens (ppr_lexpr cmd)
+
+-- Put a var in backquotes if it's not an operator already
+pprInfix :: Outputable name => name -> SDoc
+pprInfix v | isOperator ppr_v = ppr_v
+ | otherwise = char '`' <> ppr_v <> char '`'
+ where
+ ppr_v = ppr v
+
+-- add parallel array brackets around a document
+--
+pa_brackets :: SDoc -> SDoc
+pa_brackets p = ptext SLIT("[:") <> p <> ptext SLIT(":]")