-- * Pretty printing combinators
SDoc,
docToSDoc,
- interppSP, interpp'SP, pprQuotedList, pprWithCommas,
+ interppSP, interpp'SP, pprQuotedList, pprWithCommas, quotedListWithOr,
empty, nest,
char,
text, ftext, ptext,
parens, cparen, brackets, braces, quotes, doubleQuotes, angleBrackets,
semi, comma, colon, dcolon, space, equals, dot, arrow,
lparen, rparen, lbrack, rbrack, lbrace, rbrace, underscore,
+ blankLine,
(<>), (<+>), hcat, hsep,
($$), ($+$), vcat,
sep, cat,
fsep, fcat,
- hang, punctuate,
+ hang, punctuate, ppWhen, ppUnless,
speakNth, speakNTimes, speakN, speakNOf, plural,
-- * Converting 'SDoc' into strings and outputing it
ifPprDebug, qualName, qualModule,
mkErrStyle, defaultErrStyle, defaultDumpStyle, defaultUserStyle,
mkUserStyle, Depth(..),
-
+
-- * Error handling and debugging utilities
pprPanic, assertPprPanic, pprPanicFastInt, pprPgmError,
pprTrace, warnPprTrace,
import Panic
import Data.Char
-import Data.Word ( Word32 )
+import Data.Word
import System.IO ( Handle, stderr, stdout, hFlush )
import System.FilePath
\end{code}
Pretty.printDoc PageMode h (better_doc defaultDumpStyle)
hFlush h
where
- better_doc = doc $$ text ""
+ better_doc = doc $$ blankLine
printForUser :: Handle -> PrintUnqualified -> SDoc -> IO ()
printForUser handle unqual doc
pp_d = d sty
semi, comma, colon, equals, space, dcolon, arrow, underscore, dot :: SDoc
-lparen, rparen, lbrack, rbrack, lbrace, rbrace :: SDoc
-
-semi _sty = Pretty.semi
-comma _sty = Pretty.comma
-colon _sty = Pretty.colon
-equals _sty = Pretty.equals
-space _sty = Pretty.space
-dcolon _sty = Pretty.ptext (sLit "::")
-arrow _sty = Pretty.ptext (sLit "->")
-underscore = char '_'
-dot = char '.'
-lparen _sty = Pretty.lparen
-rparen _sty = Pretty.rparen
-lbrack _sty = Pretty.lbrack
-rbrack _sty = Pretty.rbrack
-lbrace _sty = Pretty.lbrace
-rbrace _sty = Pretty.rbrace
+lparen, rparen, lbrack, rbrack, lbrace, rbrace, blankLine :: SDoc
+
+blankLine _sty = Pretty.ptext (sLit "")
+dcolon _sty = Pretty.ptext (sLit "::")
+arrow _sty = Pretty.ptext (sLit "->")
+semi _sty = Pretty.semi
+comma _sty = Pretty.comma
+colon _sty = Pretty.colon
+equals _sty = Pretty.equals
+space _sty = Pretty.space
+underscore = char '_'
+dot = char '.'
+lparen _sty = Pretty.lparen
+rparen _sty = Pretty.rparen
+lbrack _sty = Pretty.lbrack
+rbrack _sty = Pretty.rbrack
+lbrace _sty = Pretty.lbrace
+rbrace _sty = Pretty.rbrace
nest :: Int -> SDoc -> SDoc
-- ^ Indent 'SDoc' some specified amount
where
go d [] = [d]
go d (e:es) = (d <> p) : go e es
+
+ppWhen, ppUnless :: Bool -> SDoc -> SDoc
+ppWhen True doc = doc
+ppWhen False _ = empty
+
+ppUnless True _ = empty
+ppUnless False doc = doc
\end{code}
instance Outputable Int where
ppr n = int n
+instance Outputable Word16 where
+ ppr n = integer $ fromIntegral n
+
instance Outputable Word32 where
ppr n = integer $ fromIntegral n
+instance Outputable Word where
+ ppr n = integer $ fromIntegral n
+
instance Outputable () where
ppr _ = text "()"
--
-- > [x,y,z] ==> `x', `y', `z'
pprQuotedList :: Outputable a => [a] -> SDoc
-pprQuotedList xs = hsep (punctuate comma (map (quotes . ppr) xs))
+pprQuotedList = quotedList . map ppr
+
+quotedList :: [SDoc] -> SDoc
+quotedList xs = hsep (punctuate comma (map quotes xs))
+
+quotedListWithOr :: [SDoc] -> SDoc
+-- [x,y,z] ==> `x', `y' or `z'
+quotedListWithOr xs@(_:_:_) = quotedList (init xs) <+> ptext (sLit "or") <+> quotes (last xs)
+quotedListWithOr xs = quotedList xs
\end{code}
warnPprTrace _ _file _line _msg x | opt_NoDebugOutput = x
warnPprTrace False _file _line _msg x = x
warnPprTrace True file line msg x
- = trace (show (doc PprDebug)) x
+ = trace (show (doc defaultDumpStyle)) x
where
doc = sep [hsep [text "WARNING: file", text file, text "line", int line],
msg]