forms of ``output.''
\begin{code}
-
module Outputable (
Outputable(..), OutputableBndr(..), -- Class
BindingSite(..),
- PprStyle, CodeStyle(..), PrintUnqualified, alwaysQualify,
- getPprStyle, withPprStyle, withPprStyleDoc, pprDeeper, pprSetDepth,
+ PprStyle, CodeStyle(..), PrintUnqualified, alwaysQualify, neverQualify,
+ QualifyName(..),
+ getPprStyle, withPprStyle, withPprStyleDoc,
+ pprDeeper, pprDeeperList, pprSetDepth,
codeStyle, userStyle, debugStyle, dumpStyle, asmStyle,
ifPprDebug, qualName, qualModule,
mkErrStyle, defaultErrStyle, defaultDumpStyle, defaultUserStyle,
+ mkUserStyle,
SDoc, -- Abstract
docToSDoc,
hang, punctuate,
speakNth, speakNTimes, speakN, speakNOf, plural,
- printSDoc, printErrs, printDump,
- printForC, printForAsm, printForUser,
+ printSDoc, printErrs, hPrintDump, printDump,
+ printForC, printForAsm, printForUser, printForUserPartWay,
pprCode, mkCodeStyle,
showSDoc, showSDocForUser, showSDocDebug, showSDocDump,
showSDocUnqual, showsPrecSDoc,
#include "HsVersions.h"
-import {-# SOURCE #-} Module( Module, modulePackageId,
- ModuleName, moduleName )
+import {-# SOURCE #-} Module( Module, ModuleName, moduleName )
import {-# SOURCE #-} OccName( OccName )
import StaticFlags ( opt_PprStyle_Debug, opt_PprUserLength )
-import PackageConfig ( PackageId, packageIdString )
import FastString
+import FastTypes
+import GHC.Ptr
import qualified Pretty
import Pretty ( Doc, Mode(..) )
import Panic
-- as @Exception.catch@, this fuction will return @Just "Exception"@.
-- Note that the return value is a ModuleName, not a Module, because
-- in source code, names are qualified by ModuleNames.
-type QualifyName = Module -> OccName -> Maybe ModuleName
+type QueryQualifyName = Module -> OccName -> QualifyName
+
+data QualifyName -- given P:M.T
+ = NameUnqual -- refer to it as "T"
+ | NameQual ModuleName -- refer to it as "X.T" for the supplied X
+ | NameNotInScope1
+ -- it is not in scope at all, but M.T is not bound in the current
+ -- scope, so we can refer to it as "M.T"
+ | NameNotInScope2
+ -- it is not in scope at all, and M.T is already bound in the
+ -- current scope, so we must refer to it as "P:M.T"
+
-- | For a given module, we need to know whether to print it with
--- a package name to disambiguate it, and if so which package name should
--- we use.
-type QualifyModule = Module -> Maybe PackageId
+-- a package name to disambiguate it.
+type QueryQualifyModule = Module -> Bool
+
+type PrintUnqualified = (QueryQualifyName, QueryQualifyModule)
-type PrintUnqualified = (QualifyName, QualifyModule)
+alwaysQualifyNames :: QueryQualifyName
+alwaysQualifyNames m _ = NameQual (moduleName m)
-alwaysQualifyNames :: QualifyName
-alwaysQualifyNames m n = Just (moduleName m)
+neverQualifyNames :: QueryQualifyName
+neverQualifyNames _ _ = NameUnqual
-neverQualifyNames :: QualifyName
-neverQualifyNames m n = Nothing
+alwaysQualifyModules :: QueryQualifyModule
+alwaysQualifyModules _ = True
-alwaysQualifyModules :: QualifyModule
-alwaysQualifyModules m = Just (modulePackageId m)
+neverQualifyModules :: QueryQualifyModule
+neverQualifyModules _ = False
-neverQualifyModules :: QualifyModule
-neverQualifyModules m = Nothing
+type QueryQualifies = (QueryQualifyName, QueryQualifyModule)
+alwaysQualify, neverQualify :: QueryQualifies
alwaysQualify = (alwaysQualifyNames, alwaysQualifyModules)
neverQualify = (neverQualifyNames, neverQualifyModules)
+defaultUserStyle, defaultDumpStyle :: PprStyle
+
defaultUserStyle = mkUserStyle alwaysQualify AllTheWay
defaultDumpStyle | opt_PprStyle_Debug = PprDebug
| opt_PprStyle_Debug = mkUserStyle alwaysQualify AllTheWay
| otherwise = mkUserStyle alwaysQualify (PartWay opt_PprUserLength)
+mkUserStyle :: QueryQualifies -> Depth -> PprStyle
mkUserStyle unqual depth
| opt_PprStyle_Debug = PprDebug
| otherwise = PprUser unqual depth
type SDoc = PprStyle -> Doc
withPprStyle :: PprStyle -> SDoc -> SDoc
-withPprStyle sty d sty' = d sty
+withPprStyle sty d _sty' = d sty
withPprStyleDoc :: PprStyle -> SDoc -> Doc
withPprStyleDoc sty d = d sty
pprDeeper :: SDoc -> SDoc
-pprDeeper d (PprUser q (PartWay 0)) = Pretty.text "..."
+pprDeeper _ (PprUser _ (PartWay 0)) = Pretty.text "..."
pprDeeper d (PprUser q (PartWay n)) = d (PprUser q (PartWay (n-1)))
pprDeeper d other_sty = d other_sty
+pprDeeperList :: ([SDoc] -> SDoc) -> [SDoc] -> SDoc
+-- Truncate a list that list that is longer than the current depth
+pprDeeperList f ds (PprUser q (PartWay n))
+ | n==0 = Pretty.text "..."
+ | otherwise = f (go 0 ds) (PprUser q (PartWay (n-1)))
+ where
+ go _ [] = []
+ go i (d:ds) | i >= n = [text "...."]
+ | otherwise = d : go (i+1) ds
+
+pprDeeperList f ds other_sty
+ = f ds other_sty
+
pprSetDepth :: Int -> SDoc -> SDoc
-pprSetDepth n d (PprUser q _) = d (PprUser q (PartWay n))
-pprSetDepth n d other_sty = d other_sty
+pprSetDepth n d (PprUser q _) = d (PprUser q (PartWay n))
+pprSetDepth _n d other_sty = d other_sty
getPprStyle :: (PprStyle -> SDoc) -> SDoc
getPprStyle df sty = df sty sty
\end{code}
\begin{code}
-qualName :: PprStyle -> QualifyName
-qualName (PprUser (qual_name,_) _) m n = qual_name m n
-qualName other m n = Just (moduleName m)
+qualName :: PprStyle -> QueryQualifyName
+qualName (PprUser (qual_name,_) _) m n = qual_name m n
+qualName _other m _n = NameQual (moduleName m)
-qualModule :: PprStyle -> QualifyModule
-qualModule (PprUser (_,qual_mod) _) m = qual_mod m
-qualModule other m = Just (modulePackageId m)
+qualModule :: PprStyle -> QueryQualifyModule
+qualModule (PprUser (_,qual_mod) _) m = qual_mod m
+qualModule _other _m = True
codeStyle :: PprStyle -> Bool
codeStyle (PprCode _) = True
asmStyle :: PprStyle -> Bool
asmStyle (PprCode AsmStyle) = True
-asmStyle other = False
+asmStyle _other = False
dumpStyle :: PprStyle -> Bool
dumpStyle PprDump = True
-dumpStyle other = False
+dumpStyle _other = False
debugStyle :: PprStyle -> Bool
debugStyle PprDebug = True
-debugStyle other = False
+debugStyle _other = False
userStyle :: PprStyle -> Bool
userStyle (PprUser _ _) = True
-userStyle other = False
+userStyle _other = False
ifPprDebug :: SDoc -> SDoc -- Empty for non-debug style
ifPprDebug d sty@PprDebug = d sty
-ifPprDebug d sty = Pretty.empty
+ifPprDebug _ _ = Pretty.empty
\end{code}
\begin{code}
hFlush stderr
printDump :: SDoc -> IO ()
-printDump doc = do
- Pretty.printDoc PageMode stdout (better_doc defaultDumpStyle)
- hFlush stdout
+printDump doc = hPrintDump stdout doc
+
+hPrintDump :: Handle -> SDoc -> IO ()
+hPrintDump h doc = do
+ Pretty.printDoc PageMode h (better_doc defaultDumpStyle)
+ hFlush h
where
better_doc = doc $$ text ""
printForUser handle unqual doc
= Pretty.printDoc PageMode handle (doc (mkUserStyle unqual AllTheWay))
+printForUserPartWay :: Handle -> Int -> PrintUnqualified -> SDoc -> IO ()
+printForUserPartWay handle d unqual doc
+ = Pretty.printDoc PageMode handle (doc (mkUserStyle unqual (PartWay d)))
+
-- printForC, printForAsm do what they sound like
printForC :: Handle -> SDoc -> IO ()
printForC handle doc = Pretty.printDoc LeftMode handle (doc (PprCode CStyle))
docToSDoc :: Doc -> SDoc
docToSDoc d = \_ -> d
-empty sty = Pretty.empty
-text s sty = Pretty.text s
-char c sty = Pretty.char c
-ftext s sty = Pretty.ftext s
-ptext s sty = Pretty.ptext s
-int n sty = Pretty.int n
-integer n sty = Pretty.integer n
-float n sty = Pretty.float n
-double n sty = Pretty.double n
-rational n sty = Pretty.rational n
+empty :: SDoc
+text :: String -> SDoc
+char :: Char -> SDoc
+ftext :: FastString -> SDoc
+ptext :: Ptr t -> SDoc
+int :: Int -> SDoc
+integer :: Integer -> SDoc
+float :: Float -> SDoc
+double :: Double -> SDoc
+rational :: Rational -> SDoc
+
+empty _sty = Pretty.empty
+text s _sty = Pretty.text s
+char c _sty = Pretty.char c
+ftext s _sty = Pretty.ftext s
+ptext s _sty = Pretty.ptext s
+int n _sty = Pretty.int n
+integer n _sty = Pretty.integer n
+float n _sty = Pretty.float n
+double n _sty = Pretty.double n
+rational n _sty = Pretty.rational n
+
+parens, braces, brackets, quotes, doubleQuotes, angleBrackets :: SDoc -> SDoc
parens d sty = Pretty.parens (d sty)
braces d sty = Pretty.braces (d sty)
doubleQuotes d sty = Pretty.doubleQuotes (d sty)
angleBrackets d = char '<' <> d <> char '>'
+cparen :: Bool -> SDoc -> SDoc
+
cparen b d sty = Pretty.cparen b (d sty)
-- quotes encloses something in single quotes...
-- so that we don't get `foo''. Instead we just have foo'.
quotes d sty = case show pp_d of
('\'' : _) -> pp_d
- other -> Pretty.quotes pp_d
+ _other -> Pretty.quotes pp_d
where
pp_d = d sty
-semi sty = Pretty.semi
-comma sty = Pretty.comma
-colon sty = Pretty.colon
-equals sty = Pretty.equals
-space sty = Pretty.space
-lparen sty = Pretty.lparen
-rparen sty = Pretty.rparen
-lbrack sty = Pretty.lbrack
-rbrack sty = Pretty.rbrack
-lbrace sty = Pretty.lbrace
-rbrace sty = Pretty.rbrace
-dcolon sty = Pretty.ptext SLIT("::")
-arrow sty = Pretty.ptext SLIT("->")
-underscore = char '_'
-dot = char '.'
+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
+
+nest :: Int -> SDoc -> SDoc
+(<>), (<+>), ($$), ($+$) :: SDoc -> SDoc -> SDoc
nest n d sty = Pretty.nest n (d sty)
(<>) d1 d2 sty = (Pretty.<>) (d1 sty) (d2 sty)
($$) d1 d2 sty = (Pretty.$$) (d1 sty) (d2 sty)
($+$) d1 d2 sty = (Pretty.$+$) (d1 sty) (d2 sty)
+hcat, hsep, vcat, sep, cat, fsep, fcat :: [SDoc] -> SDoc
+
+
hcat ds sty = Pretty.hcat [d sty | d <- ds]
hsep ds sty = Pretty.hsep [d sty | d <- ds]
vcat ds sty = Pretty.vcat [d sty | d <- ds]
fsep ds sty = Pretty.fsep [d sty | d <- ds]
fcat ds sty = Pretty.fcat [d sty | d <- ds]
+hang :: SDoc -> Int -> SDoc -> SDoc
+
hang d1 n d2 sty = Pretty.hang (d1 sty) n (d2 sty)
punctuate :: SDoc -> [SDoc] -> [SDoc]
-punctuate p [] = []
+punctuate _ [] = []
punctuate p (d:ds) = go d ds
where
go d [] = [d]
ppr Nothing = ptext SLIT("Nothing")
ppr (Just x) = ptext SLIT("Just") <+> ppr x
+instance (Outputable a, Outputable b) => Outputable (Either a b) where
+ ppr (Left x) = ptext SLIT("Left") <+> ppr x
+ ppr (Right y) = ptext SLIT("Right") <+> ppr y
+
-- ToDo: may not be used
instance (Outputable a, Outputable b, Outputable c) => Outputable (a, b, c) where
ppr (x,y,z) =
instance Outputable FastString where
ppr fs = ftext fs -- Prints an unadorned string,
-- no double quotes or anything
-
-instance Outputable PackageId where
- ppr pid = text (packageIdString pid)
\end{code}
class Outputable a => OutputableBndr a where
pprBndr :: BindingSite -> a -> SDoc
- pprBndr b x = ppr x
+ pprBndr _b x = ppr x
\end{code}
| t == 2 = ptext SLIT("twice")
| otherwise = speakN t <+> ptext SLIT("times")
-plural [x] = empty
-plural xs = char 's'
+plural :: [a] -> SDoc
+plural [_] = empty -- a bit frightening, but there you are
+plural _ = char 's'
\end{code}
-- (used for unusual pgm errors)
pprTrace = pprAndThen trace
+pprPanic# :: String -> SDoc -> FastInt
pprPanic# heading pretty_msg = panic# (show (doc PprDebug))
where
doc = text heading <+> pretty_msg
msg]
warnPprTrace :: Bool -> String -> Int -> SDoc -> a -> a
-warnPprTrace False file line msg x = x
-warnPprTrace True file line msg x
+warnPprTrace False _file _line _msg x = x
+warnPprTrace True file line msg x
= trace (show (doc PprDebug)) x
where
doc = sep [hsep [text "WARNING: file", text file, text "line", int line],