Commit d45197aa authored by Ian Lynagh's avatar Ian Lynagh
Browse files

Merge branch 'coloured-core' of https://github.com/nominolo/ghc into coloured-core

parents c5f74966 daead6bf
...@@ -73,7 +73,6 @@ module Module ...@@ -73,7 +73,6 @@ module Module
import Config import Config
import Outputable import Outputable
import qualified Pretty
import Unique import Unique
import UniqFM import UniqFM
import FastString import FastString
...@@ -253,9 +252,10 @@ mkModule :: PackageId -> ModuleName -> Module ...@@ -253,9 +252,10 @@ mkModule :: PackageId -> ModuleName -> Module
mkModule = Module mkModule = Module
pprModule :: Module -> SDoc pprModule :: Module -> SDoc
pprModule mod@(Module p n) = pprPackagePrefix p mod <> pprModuleName n pprModule mod@(Module p n) =
pprPackagePrefix p mod <> pprModuleName n
pprPackagePrefix :: PackageId -> Module -> PprStyle -> Pretty.Doc pprPackagePrefix :: PackageId -> Module -> SDoc
pprPackagePrefix p mod = getPprStyle doc pprPackagePrefix p mod = getPprStyle doc
where where
doc sty doc sty
......
...@@ -233,5 +233,5 @@ missingArgErr f = Left ("missing argument for flag: " ++ f) ...@@ -233,5 +233,5 @@ missingArgErr f = Left ("missing argument for flag: " ++ f)
errorsToGhcException :: [Located String] -> GhcException errorsToGhcException :: [Located String] -> GhcException
errorsToGhcException errs = errorsToGhcException errs =
let errors = vcat [ ppr l <> text ": " <> text e | L l e <- errs ] let errors = vcat [ ppr l <> text ": " <> text e | L l e <- errs ]
in UsageError (showSDoc $ withPprStyle cmdlineParserStyle errors) in UsageError (renderWithStyle errors cmdlineParserStyle)
...@@ -804,12 +804,12 @@ defaultDynFlags mySettings = ...@@ -804,12 +804,12 @@ defaultDynFlags mySettings =
log_action = \severity srcSpan style msg -> log_action = \severity srcSpan style msg ->
case severity of case severity of
SevOutput -> printOutput (msg style) SevOutput -> printSDoc msg style
SevInfo -> printErrs (msg style) SevInfo -> printErrs msg style
SevFatal -> printErrs (msg style) SevFatal -> printErrs msg style
_ -> do _ -> do
hPutChar stderr '\n' hPutChar stderr '\n'
printErrs ((mkLocMessage srcSpan msg) style) printErrs (mkLocMessage srcSpan msg) style
-- careful (#2302): printErrs prints in UTF-8, whereas -- careful (#2302): printErrs prints in UTF-8, whereas
-- converting to string first and using hPutStr would -- converting to string first and using hPutStr would
-- just emit the low 8 bits of each unicode char. -- just emit the low 8 bits of each unicode char.
......
...@@ -67,7 +67,8 @@ mkLocMessage locn msg ...@@ -67,7 +67,8 @@ mkLocMessage locn msg
-- would look strange. Better to say explicitly "<no location info>". -- would look strange. Better to say explicitly "<no location info>".
printError :: SrcSpan -> Message -> IO () printError :: SrcSpan -> Message -> IO ()
printError span msg = printErrs (mkLocMessage span msg $ defaultErrStyle) printError span msg =
printErrs (mkLocMessage span msg) defaultErrStyle
-- ----------------------------------------------------------------------------- -- -----------------------------------------------------------------------------
......
...@@ -484,7 +484,7 @@ makeImportsDoc dflags imports ...@@ -484,7 +484,7 @@ makeImportsDoc dflags imports
| otherwise | otherwise
= Pretty.empty = Pretty.empty
doPpr lbl = (lbl, Pretty.render $ pprCLabel lbl astyle) doPpr lbl = (lbl, renderWithStyle (pprCLabel lbl) astyle)
astyle = mkCodeStyle AsmStyle astyle = mkCodeStyle AsmStyle
......
...@@ -1147,7 +1147,7 @@ failIfM :: Message -> IfL a ...@@ -1147,7 +1147,7 @@ failIfM :: Message -> IfL a
failIfM msg failIfM msg
= do { env <- getLclEnv = do { env <- getLclEnv
; let full_msg = (if_loc env <> colon) $$ nest 2 msg ; let full_msg = (if_loc env <> colon) $$ nest 2 msg
; liftIO (printErrs (full_msg defaultErrStyle)) ; liftIO (printErrs full_msg defaultErrStyle)
; failM } ; failM }
-------------------- --------------------
...@@ -1182,7 +1182,7 @@ forkM_maybe doc thing_inside ...@@ -1182,7 +1182,7 @@ forkM_maybe doc thing_inside
; return Nothing } ; return Nothing }
}} }}
where where
print_errs sdoc = liftIO (printErrs (sdoc defaultErrStyle)) print_errs sdoc = liftIO (printErrs sdoc defaultErrStyle)
forkM :: SDoc -> IfL a -> IfL a forkM :: SDoc -> IfL a -> IfL a
forkM doc thing_inside forkM doc thing_inside
......
...@@ -15,7 +15,7 @@ module Outputable ( ...@@ -15,7 +15,7 @@ module Outputable (
Outputable(..), OutputableBndr(..), Outputable(..), OutputableBndr(..),
-- * Pretty printing combinators -- * Pretty printing combinators
SDoc, SDoc, runSDoc, initSDocContext,
docToSDoc, docToSDoc,
interppSP, interpp'SP, pprQuotedList, pprWithCommas, quotedListWithOr, interppSP, interpp'SP, pprQuotedList, pprWithCommas, quotedListWithOr,
empty, nest, empty, nest,
...@@ -33,6 +33,9 @@ module Outputable ( ...@@ -33,6 +33,9 @@ module Outputable (
hang, punctuate, ppWhen, ppUnless, hang, punctuate, ppWhen, ppUnless,
speakNth, speakNTimes, speakN, speakNOf, plural, speakNth, speakNTimes, speakN, speakNOf, plural,
coloured, PprColour, colType, colCoerc, colDataCon,
colBinder, bold, keyword,
-- * Converting 'SDoc' into strings and outputing it -- * Converting 'SDoc' into strings and outputing it
printSDoc, printErrs, printOutput, hPrintDump, printDump, printSDoc, printErrs, printOutput, hPrintDump, printDump,
printForC, printForAsm, printForUser, printForUserPartWay, printForC, printForAsm, printForUser, printForUserPartWay,
...@@ -41,6 +44,7 @@ module Outputable ( ...@@ -41,6 +44,7 @@ module Outputable (
showSDocForUser, showSDocDebug, showSDocDump, showSDocDumpOneLine, showSDocForUser, showSDocDebug, showSDocDump, showSDocDumpOneLine,
showPpr, showPpr,
showSDocUnqual, showsPrecSDoc, showSDocUnqual, showsPrecSDoc,
renderWithStyle,
pprInfixVar, pprPrefixVar, pprInfixVar, pprPrefixVar,
pprHsChar, pprHsString, pprHsInfix, pprHsVar, pprHsChar, pprHsString, pprHsInfix, pprHsVar,
...@@ -218,38 +222,56 @@ code (either C or assembly), or generating interface files. ...@@ -218,38 +222,56 @@ code (either C or assembly), or generating interface files.
%************************************************************************ %************************************************************************
\begin{code} \begin{code}
type SDoc = PprStyle -> Doc newtype SDoc = SDoc { runSDoc :: SDocContext -> Doc }
data SDocContext = SDC
{ sdocStyle :: !PprStyle
, sdocLastColour :: !PprColour
-- ^ The most recently used colour. This allows nesting colours.
}
initSDocContext :: PprStyle -> SDocContext
initSDocContext sty = SDC
{ sdocStyle = sty
, sdocLastColour = colReset
}
withPprStyle :: PprStyle -> SDoc -> SDoc withPprStyle :: PprStyle -> SDoc -> SDoc
withPprStyle sty d _sty' = d sty withPprStyle sty d = SDoc $ \ctxt -> runSDoc d ctxt{sdocStyle=sty}
withPprStyleDoc :: PprStyle -> SDoc -> Doc withPprStyleDoc :: PprStyle -> SDoc -> Doc
withPprStyleDoc sty d = d sty withPprStyleDoc sty d = runSDoc d (initSDocContext sty)
pprDeeper :: SDoc -> SDoc pprDeeper :: SDoc -> SDoc
pprDeeper _ (PprUser _ (PartWay 0)) = Pretty.text "..." pprDeeper d = SDoc $ \ctx -> case ctx of
pprDeeper d (PprUser q (PartWay n)) = d (PprUser q (PartWay (n-1))) SDC{sdocStyle=PprUser _ (PartWay 0)} -> Pretty.text "..."
pprDeeper d other_sty = d other_sty SDC{sdocStyle=PprUser q (PartWay n)} ->
runSDoc d ctx{sdocStyle = PprUser q (PartWay (n-1))}
_ -> runSDoc d ctx
pprDeeperList :: ([SDoc] -> SDoc) -> [SDoc] -> SDoc pprDeeperList :: ([SDoc] -> SDoc) -> [SDoc] -> SDoc
-- Truncate a list that list that is longer than the current depth -- Truncate a list that list that is longer than the current depth
pprDeeperList f ds (PprUser q (PartWay n)) pprDeeperList f ds = SDoc work
where
work ctx@SDC{sdocStyle=PprUser q (PartWay n)}
| n==0 = Pretty.text "..." | n==0 = Pretty.text "..."
| otherwise = f (go 0 ds) (PprUser q (PartWay (n-1))) | otherwise =
runSDoc (f (go 0 ds)) ctx{sdocStyle = PprUser q (PartWay (n-1))}
where where
go _ [] = [] go _ [] = []
go i (d:ds) | i >= n = [text "...."] go i (d:ds) | i >= n = [text "...."]
| otherwise = d : go (i+1) ds | otherwise = d : go (i+1) ds
work other_ctx = runSDoc (f ds) other_ctx
pprDeeperList f ds other_sty
= f ds other_sty
pprSetDepth :: Depth -> SDoc -> SDoc pprSetDepth :: Depth -> SDoc -> SDoc
pprSetDepth depth doc (PprUser q _) = doc (PprUser q depth) pprSetDepth depth doc = SDoc $ \ctx -> case ctx of
pprSetDepth _depth doc other_sty = doc other_sty SDC{sdocStyle=PprUser q _} ->
runSDoc doc ctx{sdocStyle = PprUser q depth}
_ ->
runSDoc doc ctx
getPprStyle :: (PprStyle -> SDoc) -> SDoc getPprStyle :: (PprStyle -> SDoc) -> SDoc
getPprStyle df sty = df sty sty getPprStyle df = SDoc $ \ctx -> runSDoc (df (sdocStyle ctx)) ctx
\end{code} \end{code}
\begin{code} \begin{code}
...@@ -282,21 +304,23 @@ userStyle (PprUser _ _) = True ...@@ -282,21 +304,23 @@ userStyle (PprUser _ _) = True
userStyle _other = False userStyle _other = False
ifPprDebug :: SDoc -> SDoc -- Empty for non-debug style ifPprDebug :: SDoc -> SDoc -- Empty for non-debug style
ifPprDebug d sty@PprDebug = d sty ifPprDebug d = SDoc $ \ctx -> case ctx of
ifPprDebug _ _ = Pretty.empty SDC{sdocStyle=PprDebug} -> runSDoc d ctx
_ -> Pretty.empty
\end{code} \end{code}
\begin{code} \begin{code}
-- Unused [7/02 sof] -- Unused [7/02 sof]
printSDoc :: SDoc -> PprStyle -> IO () printSDoc :: SDoc -> PprStyle -> IO ()
printSDoc d sty = do printSDoc d sty = do
Pretty.printDoc PageMode stdout (d sty) Pretty.printDoc PageMode stdout (runSDoc d (initSDocContext sty))
hFlush stdout hFlush stdout
-- I'm not sure whether the direct-IO approach of Pretty.printDoc -- I'm not sure whether the direct-IO approach of Pretty.printDoc
-- above is better or worse than the put-big-string approach here -- above is better or worse than the put-big-string approach here
printErrs :: Doc -> IO () printErrs :: SDoc -> PprStyle -> IO ()
printErrs doc = do Pretty.printDoc PageMode stderr doc printErrs doc sty = do
Pretty.printDoc PageMode stderr (runSDoc doc (initSDocContext sty))
hFlush stderr hFlush stderr
printOutput :: Doc -> IO () printOutput :: Doc -> IO ()
...@@ -307,25 +331,32 @@ printDump doc = hPrintDump stdout doc ...@@ -307,25 +331,32 @@ printDump doc = hPrintDump stdout doc
hPrintDump :: Handle -> SDoc -> IO () hPrintDump :: Handle -> SDoc -> IO ()
hPrintDump h doc = do hPrintDump h doc = do
Pretty.printDoc PageMode h (better_doc defaultDumpStyle) Pretty.printDoc PageMode h
(runSDoc better_doc (initSDocContext defaultDumpStyle))
hFlush h hFlush h
where where
better_doc = doc $$ blankLine better_doc = doc $$ blankLine
printForUser :: Handle -> PrintUnqualified -> SDoc -> IO () printForUser :: Handle -> PrintUnqualified -> SDoc -> IO ()
printForUser handle unqual doc printForUser handle unqual doc
= Pretty.printDoc PageMode handle (doc (mkUserStyle unqual AllTheWay)) = Pretty.printDoc PageMode handle
(runSDoc doc (initSDocContext (mkUserStyle unqual AllTheWay)))
printForUserPartWay :: Handle -> Int -> PrintUnqualified -> SDoc -> IO () printForUserPartWay :: Handle -> Int -> PrintUnqualified -> SDoc -> IO ()
printForUserPartWay handle d unqual doc printForUserPartWay handle d unqual doc
= Pretty.printDoc PageMode handle (doc (mkUserStyle unqual (PartWay d))) = Pretty.printDoc PageMode handle
(runSDoc doc (initSDocContext (mkUserStyle unqual (PartWay d))))
-- printForC, printForAsm do what they sound like -- printForC, printForAsm do what they sound like
printForC :: Handle -> SDoc -> IO () printForC :: Handle -> SDoc -> IO ()
printForC handle doc = Pretty.printDoc LeftMode handle (doc (PprCode CStyle)) printForC handle doc =
Pretty.printDoc LeftMode handle
(runSDoc doc (initSDocContext (PprCode CStyle)))
printForAsm :: Handle -> SDoc -> IO () printForAsm :: Handle -> SDoc -> IO ()
printForAsm handle doc = Pretty.printDoc LeftMode handle (doc (PprCode AsmStyle)) printForAsm handle doc =
Pretty.printDoc LeftMode handle
(runSDoc doc (initSDocContext (PprCode AsmStyle)))
pprCode :: CodeStyle -> SDoc -> SDoc pprCode :: CodeStyle -> SDoc -> SDoc
pprCode cs d = withPprStyle (PprCode cs) d pprCode cs d = withPprStyle (PprCode cs) d
...@@ -337,32 +368,44 @@ mkCodeStyle = PprCode ...@@ -337,32 +368,44 @@ mkCodeStyle = PprCode
-- However, Doc *is* an instance of Show -- However, Doc *is* an instance of Show
-- showSDoc just blasts it out as a string -- showSDoc just blasts it out as a string
showSDoc :: SDoc -> String showSDoc :: SDoc -> String
showSDoc d = Pretty.showDocWith PageMode (d defaultUserStyle) showSDoc d =
Pretty.showDocWith PageMode
(runSDoc d (initSDocContext defaultUserStyle))
renderWithStyle :: SDoc -> PprStyle -> String
renderWithStyle sdoc sty =
Pretty.render (runSDoc sdoc (initSDocContext sty))
-- This shows an SDoc, but on one line only. It's cheaper than a full -- This shows an SDoc, but on one line only. It's cheaper than a full
-- showSDoc, designed for when we're getting results like "Foo.bar" -- showSDoc, designed for when we're getting results like "Foo.bar"
-- and "foo{uniq strictness}" so we don't want fancy layout anyway. -- and "foo{uniq strictness}" so we don't want fancy layout anyway.
showSDocOneLine :: SDoc -> String showSDocOneLine :: SDoc -> String
showSDocOneLine d = Pretty.showDocWith PageMode (d defaultUserStyle) showSDocOneLine d =
Pretty.showDocWith PageMode
(runSDoc d (initSDocContext defaultUserStyle))
showSDocForUser :: PrintUnqualified -> SDoc -> String showSDocForUser :: PrintUnqualified -> SDoc -> String
showSDocForUser unqual doc = show (doc (mkUserStyle unqual AllTheWay)) showSDocForUser unqual doc =
show (runSDoc doc (initSDocContext (mkUserStyle unqual AllTheWay)))
showSDocUnqual :: SDoc -> String showSDocUnqual :: SDoc -> String
-- Only used in the gruesome isOperator -- Only used in the gruesome isOperator
showSDocUnqual d = show (d (mkUserStyle neverQualify AllTheWay)) showSDocUnqual d =
show (runSDoc d (initSDocContext (mkUserStyle neverQualify AllTheWay)))
showsPrecSDoc :: Int -> SDoc -> ShowS showsPrecSDoc :: Int -> SDoc -> ShowS
showsPrecSDoc p d = showsPrec p (d defaultUserStyle) showsPrecSDoc p d = showsPrec p (runSDoc d (initSDocContext defaultUserStyle))
showSDocDump :: SDoc -> String showSDocDump :: SDoc -> String
showSDocDump d = Pretty.showDocWith PageMode (d PprDump) showSDocDump d =
Pretty.showDocWith PageMode (runSDoc d (initSDocContext PprDump))
showSDocDumpOneLine :: SDoc -> String showSDocDumpOneLine :: SDoc -> String
showSDocDumpOneLine d = Pretty.showDocWith OneLineMode (d PprDump) showSDocDumpOneLine d =
Pretty.showDocWith OneLineMode (runSDoc d (initSDocContext PprDump))
showSDocDebug :: SDoc -> String showSDocDebug :: SDoc -> String
showSDocDebug d = show (d PprDebug) showSDocDebug d = show (runSDoc d (initSDocContext PprDebug))
showPpr :: Outputable a => a -> String showPpr :: Outputable a => a -> String
showPpr = showSDoc . ppr showPpr = showSDoc . ppr
...@@ -370,7 +413,7 @@ showPpr = showSDoc . ppr ...@@ -370,7 +413,7 @@ showPpr = showSDoc . ppr
\begin{code} \begin{code}
docToSDoc :: Doc -> SDoc docToSDoc :: Doc -> SDoc
docToSDoc d = \_ -> d docToSDoc d = SDoc (\_ -> d)
empty :: SDoc empty :: SDoc
char :: Char -> SDoc char :: Char -> SDoc
...@@ -383,58 +426,58 @@ float :: Float -> SDoc ...@@ -383,58 +426,58 @@ float :: Float -> SDoc
double :: Double -> SDoc double :: Double -> SDoc
rational :: Rational -> SDoc rational :: Rational -> SDoc
empty _sty = Pretty.empty empty = docToSDoc $ Pretty.empty
char c _sty = Pretty.char c char c = docToSDoc $ Pretty.char c
text s _sty = Pretty.text s text s = docToSDoc $ Pretty.text s
ftext s _sty = Pretty.ftext s ftext s = docToSDoc $ Pretty.ftext s
ptext s _sty = Pretty.ptext s ptext s = docToSDoc $ Pretty.ptext s
int n _sty = Pretty.int n int n = docToSDoc $ Pretty.int n
integer n _sty = Pretty.integer n integer n = docToSDoc $ Pretty.integer n
float n _sty = Pretty.float n float n = docToSDoc $ Pretty.float n
double n _sty = Pretty.double n double n = docToSDoc $ Pretty.double n
rational n _sty = Pretty.rational n rational n = docToSDoc $ Pretty.rational n
parens, braces, brackets, quotes, doubleQuotes, angleBrackets :: SDoc -> SDoc parens, braces, brackets, quotes, doubleQuotes, angleBrackets :: SDoc -> SDoc
parens d sty = Pretty.parens (d sty) parens d = SDoc $ Pretty.parens . runSDoc d
braces d sty = Pretty.braces (d sty) braces d = SDoc $ Pretty.braces . runSDoc d
brackets d sty = Pretty.brackets (d sty) brackets d = SDoc $ Pretty.brackets . runSDoc d
doubleQuotes d sty = Pretty.doubleQuotes (d sty) doubleQuotes d = SDoc $ Pretty.doubleQuotes . runSDoc d
angleBrackets d = char '<' <> d <> char '>' angleBrackets d = char '<' <> d <> char '>'
cparen :: Bool -> SDoc -> SDoc cparen :: Bool -> SDoc -> SDoc
cparen b d sty = Pretty.cparen b (d sty) cparen b d = SDoc $ Pretty.cparen b . runSDoc d
-- quotes encloses something in single quotes... -- quotes encloses something in single quotes...
-- but it omits them if the thing ends in a single quote -- but it omits them if the thing ends in a single quote
-- so that we don't get `foo''. Instead we just have foo'. -- so that we don't get `foo''. Instead we just have foo'.
quotes d sty = case show pp_d of quotes d = SDoc $ \sty ->
let pp_d = runSDoc d sty in
case show pp_d of
('\'' : _) -> pp_d ('\'' : _) -> pp_d
_other -> Pretty.quotes pp_d _other -> Pretty.quotes pp_d
where
pp_d = d sty
semi, comma, colon, equals, space, dcolon, arrow, underscore, dot :: SDoc semi, comma, colon, equals, space, dcolon, arrow, underscore, dot :: SDoc
darrow, lparen, rparen, lbrack, rbrack, lbrace, rbrace, blankLine :: SDoc darrow, lparen, rparen, lbrack, rbrack, lbrace, rbrace, blankLine :: SDoc
blankLine _sty = Pretty.ptext (sLit "") blankLine = docToSDoc $ Pretty.ptext (sLit "")
dcolon _sty = Pretty.ptext (sLit "::") dcolon = docToSDoc $ Pretty.ptext (sLit "::")
arrow _sty = Pretty.ptext (sLit "->") arrow = docToSDoc $ Pretty.ptext (sLit "->")
darrow _sty = Pretty.ptext (sLit "=>") darrow = docToSDoc $ Pretty.ptext (sLit "=>")
semi _sty = Pretty.semi semi = docToSDoc $ Pretty.semi
comma _sty = Pretty.comma comma = docToSDoc $ Pretty.comma
colon _sty = Pretty.colon colon = docToSDoc $ Pretty.colon
equals _sty = Pretty.equals equals = docToSDoc $ Pretty.equals
space _sty = Pretty.space space = docToSDoc $ Pretty.space
underscore = char '_' underscore = char '_'
dot = char '.' dot = char '.'
lparen _sty = Pretty.lparen lparen = docToSDoc $ Pretty.lparen
rparen _sty = Pretty.rparen rparen = docToSDoc $ Pretty.rparen
lbrack _sty = Pretty.lbrack lbrack = docToSDoc $ Pretty.lbrack
rbrack _sty = Pretty.rbrack rbrack = docToSDoc $ Pretty.rbrack
lbrace _sty = Pretty.lbrace lbrace = docToSDoc $ Pretty.lbrace
rbrace _sty = Pretty.rbrace rbrace = docToSDoc $ Pretty.rbrace
nest :: Int -> SDoc -> SDoc nest :: Int -> SDoc -> SDoc
-- ^ Indent 'SDoc' some specified amount -- ^ Indent 'SDoc' some specified amount
...@@ -448,11 +491,11 @@ nest :: Int -> SDoc -> SDoc ...@@ -448,11 +491,11 @@ nest :: Int -> SDoc -> SDoc
($+$) :: SDoc -> SDoc -> SDoc ($+$) :: SDoc -> SDoc -> SDoc
-- ^ Join two 'SDoc' together vertically -- ^ Join two 'SDoc' together vertically
nest n d sty = Pretty.nest n (d sty) nest n d = SDoc $ Pretty.nest n . runSDoc d
(<>) d1 d2 sty = (Pretty.<>) (d1 sty) (d2 sty) (<>) d1 d2 = SDoc $ \sty -> (Pretty.<>) (runSDoc d1 sty) (runSDoc d2 sty)
(<+>) d1 d2 sty = (Pretty.<+>) (d1 sty) (d2 sty) (<+>) d1 d2 = SDoc $ \sty -> (Pretty.<+>) (runSDoc d1 sty) (runSDoc d2 sty)
($$) d1 d2 sty = (Pretty.$$) (d1 sty) (d2 sty) ($$) d1 d2 = SDoc $ \sty -> (Pretty.$$) (runSDoc d1 sty) (runSDoc d2 sty)
($+$) d1 d2 sty = (Pretty.$+$) (d1 sty) (d2 sty) ($+$) d1 d2 = SDoc $ \sty -> (Pretty.$+$) (runSDoc d1 sty) (runSDoc d2 sty)
hcat :: [SDoc] -> SDoc hcat :: [SDoc] -> SDoc
-- ^ Concatenate 'SDoc' horizontally -- ^ Concatenate 'SDoc' horizontally
...@@ -471,19 +514,19 @@ fcat :: [SDoc] -> SDoc ...@@ -471,19 +514,19 @@ fcat :: [SDoc] -> SDoc
-- ^ This behaves like 'fsep', but it uses '<>' for horizontal conposition rather than '<+>' -- ^ This behaves like 'fsep', but it uses '<>' for horizontal conposition rather than '<+>'
hcat ds sty = Pretty.hcat [d sty | d <- ds] hcat ds = SDoc $ \sty -> Pretty.hcat [runSDoc d sty | d <- ds]
hsep ds sty = Pretty.hsep [d sty | d <- ds] hsep ds = SDoc $ \sty -> Pretty.hsep [runSDoc d sty | d <- ds]
vcat ds sty = Pretty.vcat [d sty | d <- ds] vcat ds = SDoc $ \sty -> Pretty.vcat [runSDoc d sty | d <- ds]
sep ds sty = Pretty.sep [d sty | d <- ds] sep ds = SDoc $ \sty -> Pretty.sep [runSDoc d sty | d <- ds]
cat ds sty = Pretty.cat [d sty | d <- ds] cat ds = SDoc $ \sty -> Pretty.cat [runSDoc d sty | d <- ds]
fsep ds sty = Pretty.fsep [d sty | d <- ds] fsep ds = SDoc $ \sty -> Pretty.fsep [runSDoc d sty | d <- ds]
fcat ds sty = Pretty.fcat [d sty | d <- ds] fcat ds = SDoc $ \sty -> Pretty.fcat [runSDoc d sty | d <- ds]
hang :: SDoc -- ^ The header hang :: SDoc -- ^ The header
-> Int -- ^ Amount to indent the hung body -> Int -- ^ Amount to indent the hung body
-> SDoc -- ^ The hung body, indented and placed below the header -> SDoc -- ^ The hung body, indented and placed below the header
-> SDoc -> SDoc
hang d1 n d2 sty = Pretty.hang (d1 sty) n (d2 sty) hang d1 n d2 = SDoc $ \sty -> Pretty.hang (runSDoc d1 sty) n (runSDoc d2 sty)
punctuate :: SDoc -- ^ The punctuation punctuate :: SDoc -- ^ The punctuation
-> [SDoc] -- ^ The list that will have punctuation added between every adjacent pair of elements -> [SDoc] -- ^ The list that will have punctuation added between every adjacent pair of elements
...@@ -500,6 +543,46 @@ ppWhen False _ = empty ...@@ -500,6 +543,46 @@ ppWhen False _ = empty
ppUnless True _ = empty ppUnless True _ = empty
ppUnless False doc = doc ppUnless False doc = doc
-- | A colour\/style for use with 'coloured'.
newtype PprColour = PprColour String
-- Colours
colType :: PprColour
colType = PprColour "\27[34m"
colBold :: PprColour
colBold = PprColour "\27[;1m"
colCoerc :: PprColour
colCoerc = PprColour "\27[34m"
colDataCon :: PprColour
colDataCon = PprColour "\27[31m"
colBinder :: PprColour
colBinder = PprColour "\27[32m"
colReset :: PprColour
colReset = PprColour "\27[0m"
-- | Apply the given colour\/style for the argument.
--
-- Only takes effect if colours are enabled.
coloured :: PprColour -> SDoc -> SDoc
-- TODO: coloured _ sdoc ctxt | coloursDisabled = sdoc ctxt
coloured col@(PprColour c) sdoc =
SDoc $ \ctx@SDC{ sdocLastColour = PprColour lc } ->
let ctx' = ctx{ sdocLastColour = col } in
Pretty.zeroWidthText c Pretty.<> runSDoc sdoc ctx' Pretty.<> Pretty.zeroWidthText lc
bold :: SDoc -> SDoc
bold = coloured colBold
keyword :: SDoc -> SDoc
keyword = bold
\end{code} \end{code}
...@@ -806,13 +889,15 @@ pprDefiniteTrace str doc x = pprAndThen trace str doc x ...@@ -806,13 +889,15 @@ pprDefiniteTrace str doc x = pprAndThen trace str doc x