{-
Temporary copy of the GHC.Hs.Dump module, modified to show DeltaPos
hacked into a SrcSpan.
-}

{-# LANGUAGE RankNTypes #-}
{-# LANGUAGE ScopedTypeVariables #-}

module Language.Haskell.GHC.ExactPrint.Dump (
        -- * Dumping ASTs
        showAstData,
        BlankSrcSpan(..),
        BlankEpAnnotations(..),
    ) where

import Prelude ()
import GHC.Prelude

import GHC.Hs hiding ( ann, anns, deltaPos, realSrcSpan )

import GHC.Core.DataCon

import GHC.Data.Bag
import GHC.Data.FastString
import GHC.Types.Name.Set
import GHC.Types.Name hiding ( occName )
import GHC.Types.SrcLoc
import GHC.Types.Var
import GHC.Types.SourceText
import GHC.Unit.Module hiding ( moduleName )
import GHC.Utils.Outputable

import Data.Data hiding (Fixity)
import qualified Data.ByteString as B

import Data.Generics (extQ, ext1Q, ext2Q)
import Language.Haskell.GHC.ExactPrint.Utils

data BlankSrcSpan = BlankSrcSpan | BlankSrcSpanFile | NoBlankSrcSpan
                  deriving (BlankSrcSpan -> BlankSrcSpan -> Bool
(BlankSrcSpan -> BlankSrcSpan -> Bool)
-> (BlankSrcSpan -> BlankSrcSpan -> Bool) -> Eq BlankSrcSpan
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: BlankSrcSpan -> BlankSrcSpan -> Bool
== :: BlankSrcSpan -> BlankSrcSpan -> Bool
$c/= :: BlankSrcSpan -> BlankSrcSpan -> Bool
/= :: BlankSrcSpan -> BlankSrcSpan -> Bool
Eq,Int -> BlankSrcSpan -> ShowS
[BlankSrcSpan] -> ShowS
BlankSrcSpan -> String
(Int -> BlankSrcSpan -> ShowS)
-> (BlankSrcSpan -> String)
-> ([BlankSrcSpan] -> ShowS)
-> Show BlankSrcSpan
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> BlankSrcSpan -> ShowS
showsPrec :: Int -> BlankSrcSpan -> ShowS
$cshow :: BlankSrcSpan -> String
show :: BlankSrcSpan -> String
$cshowList :: [BlankSrcSpan] -> ShowS
showList :: [BlankSrcSpan] -> ShowS
Show)

data BlankEpAnnotations = BlankEpAnnotations | NoBlankEpAnnotations
                  deriving (BlankEpAnnotations -> BlankEpAnnotations -> Bool
(BlankEpAnnotations -> BlankEpAnnotations -> Bool)
-> (BlankEpAnnotations -> BlankEpAnnotations -> Bool)
-> Eq BlankEpAnnotations
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: BlankEpAnnotations -> BlankEpAnnotations -> Bool
== :: BlankEpAnnotations -> BlankEpAnnotations -> Bool
$c/= :: BlankEpAnnotations -> BlankEpAnnotations -> Bool
/= :: BlankEpAnnotations -> BlankEpAnnotations -> Bool
Eq,Int -> BlankEpAnnotations -> ShowS
[BlankEpAnnotations] -> ShowS
BlankEpAnnotations -> String
(Int -> BlankEpAnnotations -> ShowS)
-> (BlankEpAnnotations -> String)
-> ([BlankEpAnnotations] -> ShowS)
-> Show BlankEpAnnotations
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> BlankEpAnnotations -> ShowS
showsPrec :: Int -> BlankEpAnnotations -> ShowS
$cshow :: BlankEpAnnotations -> String
show :: BlankEpAnnotations -> String
$cshowList :: [BlankEpAnnotations] -> ShowS
showList :: [BlankEpAnnotations] -> ShowS
Show)

-- | Show a GHC syntax tree. This parameterised because it is also used for
-- comparing ASTs in ppr roundtripping tests, where the SrcSpan's are blanked
-- out, to avoid comparing locations, only structure
showAstData :: Data a => BlankSrcSpan -> BlankEpAnnotations -> a -> SDoc
showAstData :: forall a. Data a => BlankSrcSpan -> BlankEpAnnotations -> a -> SDoc
showAstData BlankSrcSpan
bs BlankEpAnnotations
ba a
a0 = SDoc
blankLine SDoc -> SDoc -> SDoc
$$ a -> SDoc
forall a. Data a => a -> SDoc
showAstData' a
a0
  where
    showAstData' :: Data a => a -> SDoc
    showAstData' :: forall a. Data a => a -> SDoc
showAstData' =
      a -> SDoc
forall a. Data a => a -> SDoc
generic
              (a -> SDoc) -> (forall e. Data e => [e] -> SDoc) -> a -> SDoc
forall d (t :: * -> *) q.
(Data d, Typeable t) =>
(d -> q) -> (forall e. Data e => t e -> q) -> d -> q
`ext1Q` [e] -> SDoc
forall e. Data e => [e] -> SDoc
list
              (a -> SDoc) -> (String -> SDoc) -> a -> SDoc
forall a b q.
(Typeable a, Typeable b) =>
(a -> q) -> (b -> q) -> a -> q
`extQ` String -> SDoc
string (a -> SDoc) -> (FastString -> SDoc) -> a -> SDoc
forall a b q.
(Typeable a, Typeable b) =>
(a -> q) -> (b -> q) -> a -> q
`extQ` FastString -> SDoc
fastString (a -> SDoc) -> (SrcSpan -> SDoc) -> a -> SDoc
forall a b q.
(Typeable a, Typeable b) =>
(a -> q) -> (b -> q) -> a -> q
`extQ` SrcSpan -> SDoc
srcSpan (a -> SDoc) -> (RealSrcSpan -> SDoc) -> a -> SDoc
forall a b q.
(Typeable a, Typeable b) =>
(a -> q) -> (b -> q) -> a -> q
`extQ` RealSrcSpan -> SDoc
realSrcSpan
              (a -> SDoc) -> (EpAnn [AddEpAnn] -> SDoc) -> a -> SDoc
forall a b q.
(Typeable a, Typeable b) =>
(a -> q) -> (b -> q) -> a -> q
`extQ` EpAnn [AddEpAnn] -> SDoc
annotation
              (a -> SDoc) -> (EpAnn AnnsModule -> SDoc) -> a -> SDoc
forall a b q.
(Typeable a, Typeable b) =>
(a -> q) -> (b -> q) -> a -> q
`extQ` EpAnn AnnsModule -> SDoc
annotationModule
              (a -> SDoc) -> (EpAnn AddEpAnn -> SDoc) -> a -> SDoc
forall a b q.
(Typeable a, Typeable b) =>
(a -> q) -> (b -> q) -> a -> q
`extQ` EpAnn AddEpAnn -> SDoc
annotationAddEpAnn
              (a -> SDoc) -> (EpAnn GrhsAnn -> SDoc) -> a -> SDoc
forall a b q.
(Typeable a, Typeable b) =>
(a -> q) -> (b -> q) -> a -> q
`extQ` EpAnn GrhsAnn -> SDoc
annotationGrhsAnn
              (a -> SDoc) -> (EpAnn EpAnnHsCase -> SDoc) -> a -> SDoc
forall a b q.
(Typeable a, Typeable b) =>
(a -> q) -> (b -> q) -> a -> q
`extQ` EpAnn EpAnnHsCase -> SDoc
annotationEpAnnHsCase
              (a -> SDoc) -> (EpAnn AnnList -> SDoc) -> a -> SDoc
forall a b q.
(Typeable a, Typeable b) =>
(a -> q) -> (b -> q) -> a -> q
`extQ` EpAnn AnnList -> SDoc
annotationAnnList
              (a -> SDoc) -> (EpAnn EpAnnImportDecl -> SDoc) -> a -> SDoc
forall a b q.
(Typeable a, Typeable b) =>
(a -> q) -> (b -> q) -> a -> q
`extQ` EpAnn EpAnnImportDecl -> SDoc
annotationEpAnnImportDecl
              (a -> SDoc) -> (EpAnn AnnParen -> SDoc) -> a -> SDoc
forall a b q.
(Typeable a, Typeable b) =>
(a -> q) -> (b -> q) -> a -> q
`extQ` EpAnn AnnParen -> SDoc
annotationAnnParen
              (a -> SDoc) -> (EpAnn TrailingAnn -> SDoc) -> a -> SDoc
forall a b q.
(Typeable a, Typeable b) =>
(a -> q) -> (b -> q) -> a -> q
`extQ` EpAnn TrailingAnn -> SDoc
annotationTrailingAnn
              (a -> SDoc) -> (EpAnn EpaLocation -> SDoc) -> a -> SDoc
forall a b q.
(Typeable a, Typeable b) =>
(a -> q) -> (b -> q) -> a -> q
`extQ` EpAnn EpaLocation -> SDoc
annotationEpaLocation
              (a -> SDoc) -> (AddEpAnn -> SDoc) -> a -> SDoc
forall a b q.
(Typeable a, Typeable b) =>
(a -> q) -> (b -> q) -> a -> q
`extQ` AddEpAnn -> SDoc
addEpAnn
              (a -> SDoc) -> (HsLit GhcPs -> SDoc) -> a -> SDoc
forall a b q.
(Typeable a, Typeable b) =>
(a -> q) -> (b -> q) -> a -> q
`extQ` HsLit GhcPs -> SDoc
lit (a -> SDoc) -> (HsLit GhcRn -> SDoc) -> a -> SDoc
forall a b q.
(Typeable a, Typeable b) =>
(a -> q) -> (b -> q) -> a -> q
`extQ` HsLit GhcRn -> SDoc
litr (a -> SDoc) -> (HsLit GhcTc -> SDoc) -> a -> SDoc
forall a b q.
(Typeable a, Typeable b) =>
(a -> q) -> (b -> q) -> a -> q
`extQ` HsLit GhcTc -> SDoc
litt
              (a -> SDoc) -> (SourceText -> SDoc) -> a -> SDoc
forall a b q.
(Typeable a, Typeable b) =>
(a -> q) -> (b -> q) -> a -> q
`extQ` SourceText -> SDoc
sourceText
              (a -> SDoc) -> (DeltaPos -> SDoc) -> a -> SDoc
forall a b q.
(Typeable a, Typeable b) =>
(a -> q) -> (b -> q) -> a -> q
`extQ` DeltaPos -> SDoc
deltaPos
              (a -> SDoc) -> (EpaLocation -> SDoc) -> a -> SDoc
forall a b q.
(Typeable a, Typeable b) =>
(a -> q) -> (b -> q) -> a -> q
`extQ` EpaLocation -> SDoc
epaAnchor
              (a -> SDoc) -> (ByteString -> SDoc) -> a -> SDoc
forall a b q.
(Typeable a, Typeable b) =>
(a -> q) -> (b -> q) -> a -> q
`extQ` ByteString -> SDoc
bytestring
              (a -> SDoc) -> (Name -> SDoc) -> a -> SDoc
forall a b q.
(Typeable a, Typeable b) =>
(a -> q) -> (b -> q) -> a -> q
`extQ` Name -> SDoc
name (a -> SDoc) -> (OccName -> SDoc) -> a -> SDoc
forall a b q.
(Typeable a, Typeable b) =>
(a -> q) -> (b -> q) -> a -> q
`extQ` OccName -> SDoc
occName (a -> SDoc) -> (ModuleName -> SDoc) -> a -> SDoc
forall a b q.
(Typeable a, Typeable b) =>
(a -> q) -> (b -> q) -> a -> q
`extQ` ModuleName -> SDoc
moduleName (a -> SDoc) -> (Var -> SDoc) -> a -> SDoc
forall a b q.
(Typeable a, Typeable b) =>
(a -> q) -> (b -> q) -> a -> q
`extQ` Var -> SDoc
var
              (a -> SDoc) -> (DataCon -> SDoc) -> a -> SDoc
forall a b q.
(Typeable a, Typeable b) =>
(a -> q) -> (b -> q) -> a -> q
`extQ` DataCon -> SDoc
dataCon
              (a -> SDoc) -> (Bag (LocatedA (HsBind GhcRn)) -> SDoc) -> a -> SDoc
forall a b q.
(Typeable a, Typeable b) =>
(a -> q) -> (b -> q) -> a -> q
`extQ` Bag (LocatedA (HsBind GhcRn)) -> SDoc
bagName (a -> SDoc) -> (Bag (LocatedA (HsBind GhcPs)) -> SDoc) -> a -> SDoc
forall a b q.
(Typeable a, Typeable b) =>
(a -> q) -> (b -> q) -> a -> q
`extQ` Bag (LocatedA (HsBind GhcPs)) -> SDoc
bagRdrName (a -> SDoc) -> (Bag (LocatedA (HsBind GhcTc)) -> SDoc) -> a -> SDoc
forall a b q.
(Typeable a, Typeable b) =>
(a -> q) -> (b -> q) -> a -> q
`extQ` Bag (LocatedA (HsBind GhcTc)) -> SDoc
bagVar (a -> SDoc) -> (NameSet -> SDoc) -> a -> SDoc
forall a b q.
(Typeable a, Typeable b) =>
(a -> q) -> (b -> q) -> a -> q
`extQ` NameSet -> SDoc
nameSet
              (a -> SDoc) -> (Fixity -> SDoc) -> a -> SDoc
forall a b q.
(Typeable a, Typeable b) =>
(a -> q) -> (b -> q) -> a -> q
`extQ` Fixity -> SDoc
fixity
              (a -> SDoc)
-> (forall d1 d2. (Data d1, Data d2) => GenLocated d1 d2 -> SDoc)
-> a
-> SDoc
forall d (t :: * -> * -> *) q.
(Data d, Typeable t) =>
(d -> q)
-> (forall d1 d2. (Data d1, Data d2) => t d1 d2 -> q) -> d -> q
`ext2Q` GenLocated d1 d2 -> SDoc
forall d1 d2. (Data d1, Data d2) => GenLocated d1 d2 -> SDoc
located
              (a -> SDoc)
-> (SrcSpanAnn' (EpAnn AnnListItem) -> SDoc) -> a -> SDoc
forall a b q.
(Typeable a, Typeable b) =>
(a -> q) -> (b -> q) -> a -> q
`extQ` SrcSpanAnn' (EpAnn AnnListItem) -> SDoc
srcSpanAnnA
              (a -> SDoc) -> (SrcSpanAnn' (EpAnn AnnList) -> SDoc) -> a -> SDoc
forall a b q.
(Typeable a, Typeable b) =>
(a -> q) -> (b -> q) -> a -> q
`extQ` SrcSpanAnn' (EpAnn AnnList) -> SDoc
srcSpanAnnL
              (a -> SDoc) -> (SrcSpanAnn' (EpAnn AnnPragma) -> SDoc) -> a -> SDoc
forall a b q.
(Typeable a, Typeable b) =>
(a -> q) -> (b -> q) -> a -> q
`extQ` SrcSpanAnn' (EpAnn AnnPragma) -> SDoc
srcSpanAnnP
              (a -> SDoc)
-> (SrcSpanAnn' (EpAnn AnnContext) -> SDoc) -> a -> SDoc
forall a b q.
(Typeable a, Typeable b) =>
(a -> q) -> (b -> q) -> a -> q
`extQ` SrcSpanAnn' (EpAnn AnnContext) -> SDoc
srcSpanAnnC
              (a -> SDoc) -> (SrcSpanAnn' (EpAnn NameAnn) -> SDoc) -> a -> SDoc
forall a b q.
(Typeable a, Typeable b) =>
(a -> q) -> (b -> q) -> a -> q
`extQ` SrcSpanAnn' (EpAnn NameAnn) -> SDoc
srcSpanAnnN

      where generic :: Data a => a -> SDoc
            generic :: forall a. Data a => a -> SDoc
generic a
t = SDoc -> SDoc
parens (SDoc -> SDoc) -> SDoc -> SDoc
forall a b. (a -> b) -> a -> b
$ String -> SDoc
text (Constr -> String
showConstr (a -> Constr
forall a. Data a => a -> Constr
toConstr a
t))
                                  SDoc -> SDoc -> SDoc
$$ [SDoc] -> SDoc
vcat ((forall a. Data a => a -> SDoc) -> a -> [SDoc]
forall a u. Data a => (forall d. Data d => d -> u) -> a -> [u]
forall u. (forall d. Data d => d -> u) -> a -> [u]
gmapQ d -> SDoc
forall a. Data a => a -> SDoc
showAstData' a
t)

            string :: String -> SDoc
            string :: String -> SDoc
string     = String -> SDoc
text (String -> SDoc) -> ShowS -> String -> SDoc
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ShowS
normalize_newlines ShowS -> ShowS -> ShowS
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ShowS
forall a. Show a => a -> String
show

            fastString :: FastString -> SDoc
            fastString :: FastString -> SDoc
fastString FastString
s = SDoc -> SDoc
braces (SDoc -> SDoc) -> SDoc -> SDoc
forall a b. (a -> b) -> a -> b
$
                            String -> SDoc
text String
"FastString:"
                        SDoc -> SDoc -> SDoc
<+> String -> SDoc
text (ShowS
normalize_newlines ShowS -> (FastString -> String) -> FastString -> String
forall b c a. (b -> c) -> (a -> b) -> a -> c
. FastString -> String
forall a. Show a => a -> String
show (FastString -> String) -> FastString -> String
forall a b. (a -> b) -> a -> b
$ FastString
s)

            bytestring :: B.ByteString -> SDoc
            bytestring :: ByteString -> SDoc
bytestring = String -> SDoc
text (String -> SDoc) -> (ByteString -> String) -> ByteString -> SDoc
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ShowS
normalize_newlines ShowS -> (ByteString -> String) -> ByteString -> String
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ByteString -> String
forall a. Show a => a -> String
show

            list :: [t] -> SDoc
list []    = SDoc -> SDoc
brackets SDoc
empty
            list [t
x]   = SDoc -> SDoc
brackets (t -> SDoc
forall a. Data a => a -> SDoc
showAstData' t
x)
            list (t
x1 : t
x2 : [t]
xs) =  (String -> SDoc
text String
"[" SDoc -> SDoc -> SDoc
<> t -> SDoc
forall a. Data a => a -> SDoc
showAstData' t
x1)
                                SDoc -> SDoc -> SDoc
$$ t -> [t] -> SDoc
forall {t}. Data t => t -> [t] -> SDoc
go t
x2 [t]
xs
              where
                go :: t -> [t] -> SDoc
go t
y [] = String -> SDoc
text String
"," SDoc -> SDoc -> SDoc
<> t -> SDoc
forall a. Data a => a -> SDoc
showAstData' t
y SDoc -> SDoc -> SDoc
<> String -> SDoc
text String
"]"
                go t
y1 (t
y2 : [t]
ys) = (String -> SDoc
text String
"," SDoc -> SDoc -> SDoc
<> t -> SDoc
forall a. Data a => a -> SDoc
showAstData' t
y1) SDoc -> SDoc -> SDoc
$$ t -> [t] -> SDoc
go t
y2 [t]
ys

            -- Eliminate word-size dependence
            lit :: HsLit GhcPs -> SDoc
            lit :: HsLit GhcPs -> SDoc
lit (HsWordPrim   XHsWordPrim GhcPs
s Integer
x) = String -> Integer -> SourceText -> SDoc
numericLit String
"HsWord{64}Prim" Integer
x XHsWordPrim GhcPs
SourceText
s
            lit (HsWord64Prim XHsWord64Prim GhcPs
s Integer
x) = String -> Integer -> SourceText -> SDoc
numericLit String
"HsWord{64}Prim" Integer
x XHsWord64Prim GhcPs
SourceText
s
            lit (HsIntPrim    XHsIntPrim GhcPs
s Integer
x) = String -> Integer -> SourceText -> SDoc
numericLit String
"HsInt{64}Prim"  Integer
x XHsIntPrim GhcPs
SourceText
s
            lit (HsInt64Prim  XHsInt64Prim GhcPs
s Integer
x) = String -> Integer -> SourceText -> SDoc
numericLit String
"HsInt{64}Prim"  Integer
x XHsInt64Prim GhcPs
SourceText
s
            lit HsLit GhcPs
l                  = HsLit GhcPs -> SDoc
forall a. Data a => a -> SDoc
generic HsLit GhcPs
l

            litr :: HsLit GhcRn -> SDoc
            litr :: HsLit GhcRn -> SDoc
litr (HsWordPrim   XHsWordPrim GhcRn
s Integer
x) = String -> Integer -> SourceText -> SDoc
numericLit String
"HsWord{64}Prim" Integer
x XHsWordPrim GhcRn
SourceText
s
            litr (HsWord64Prim XHsWord64Prim GhcRn
s Integer
x) = String -> Integer -> SourceText -> SDoc
numericLit String
"HsWord{64}Prim" Integer
x XHsWord64Prim GhcRn
SourceText
s
            litr (HsIntPrim    XHsIntPrim GhcRn
s Integer
x) = String -> Integer -> SourceText -> SDoc
numericLit String
"HsInt{64}Prim"  Integer
x XHsIntPrim GhcRn
SourceText
s
            litr (HsInt64Prim  XHsInt64Prim GhcRn
s Integer
x) = String -> Integer -> SourceText -> SDoc
numericLit String
"HsInt{64}Prim"  Integer
x XHsInt64Prim GhcRn
SourceText
s
            litr HsLit GhcRn
l                  = HsLit GhcRn -> SDoc
forall a. Data a => a -> SDoc
generic HsLit GhcRn
l

            litt :: HsLit GhcTc -> SDoc
            litt :: HsLit GhcTc -> SDoc
litt (HsWordPrim   XHsWordPrim GhcTc
s Integer
x) = String -> Integer -> SourceText -> SDoc
numericLit String
"HsWord{64}Prim" Integer
x XHsWordPrim GhcTc
SourceText
s
            litt (HsWord64Prim XHsWord64Prim GhcTc
s Integer
x) = String -> Integer -> SourceText -> SDoc
numericLit String
"HsWord{64}Prim" Integer
x XHsWord64Prim GhcTc
SourceText
s
            litt (HsIntPrim    XHsIntPrim GhcTc
s Integer
x) = String -> Integer -> SourceText -> SDoc
numericLit String
"HsInt{64}Prim"  Integer
x XHsIntPrim GhcTc
SourceText
s
            litt (HsInt64Prim  XHsInt64Prim GhcTc
s Integer
x) = String -> Integer -> SourceText -> SDoc
numericLit String
"HsInt{64}Prim"  Integer
x XHsInt64Prim GhcTc
SourceText
s
            litt HsLit GhcTc
l                  = HsLit GhcTc -> SDoc
forall a. Data a => a -> SDoc
generic HsLit GhcTc
l

            numericLit :: String -> Integer -> SourceText -> SDoc
            numericLit :: String -> Integer -> SourceText -> SDoc
numericLit String
tag Integer
x SourceText
s = SDoc -> SDoc
braces (SDoc -> SDoc) -> SDoc -> SDoc
forall a b. (a -> b) -> a -> b
$ [SDoc] -> SDoc
hsep [ String -> SDoc
text String
tag
                                               , Integer -> SDoc
forall a. Data a => a -> SDoc
generic Integer
x
                                               , SourceText -> SDoc
forall a. Data a => a -> SDoc
generic SourceText
s ]

            sourceText :: SourceText -> SDoc
            sourceText :: SourceText -> SDoc
sourceText SourceText
NoSourceText = SDoc -> SDoc
parens (SDoc -> SDoc) -> SDoc -> SDoc
forall a b. (a -> b) -> a -> b
$ String -> SDoc
text String
"NoSourceText"
            sourceText (SourceText String
src) = case BlankSrcSpan
bs of
              BlankSrcSpan
NoBlankSrcSpan   -> SDoc -> SDoc
parens (SDoc -> SDoc) -> SDoc -> SDoc
forall a b. (a -> b) -> a -> b
$ String -> SDoc
text String
"SourceText" SDoc -> SDoc -> SDoc
<+> String -> SDoc
text String
src
              BlankSrcSpan
BlankSrcSpanFile -> SDoc -> SDoc
parens (SDoc -> SDoc) -> SDoc -> SDoc
forall a b. (a -> b) -> a -> b
$ String -> SDoc
text String
"SourceText" SDoc -> SDoc -> SDoc
<+> String -> SDoc
text String
src
              BlankSrcSpan
_                -> SDoc -> SDoc
parens (SDoc -> SDoc) -> SDoc -> SDoc
forall a b. (a -> b) -> a -> b
$ String -> SDoc
text String
"SourceText" SDoc -> SDoc -> SDoc
<+> String -> SDoc
text String
"blanked"

            epaAnchor :: EpaLocation -> SDoc
            epaAnchor :: EpaLocation -> SDoc
epaAnchor (EpaSpan RealSrcSpan
r)  = SDoc -> SDoc
parens (SDoc -> SDoc) -> SDoc -> SDoc
forall a b. (a -> b) -> a -> b
$ String -> SDoc
text String
"EpaSpan" SDoc -> SDoc -> SDoc
<+> RealSrcSpan -> SDoc
realSrcSpan RealSrcSpan
r
            epaAnchor (EpaDelta DeltaPos
d [LEpaComment]
cs) = case BlankEpAnnotations
ba of
              BlankEpAnnotations
NoBlankEpAnnotations -> SDoc -> SDoc
parens (SDoc -> SDoc) -> SDoc -> SDoc
forall a b. (a -> b) -> a -> b
$ String -> SDoc
text String
"EpaDelta" SDoc -> SDoc -> SDoc
<+> DeltaPos -> SDoc
deltaPos DeltaPos
d SDoc -> SDoc -> SDoc
<+> [LEpaComment] -> SDoc
forall a. Data a => a -> SDoc
showAstData' [LEpaComment]
cs
              BlankEpAnnotations
BlankEpAnnotations -> SDoc -> SDoc
parens (SDoc -> SDoc) -> SDoc -> SDoc
forall a b. (a -> b) -> a -> b
$ String -> SDoc
text String
"EpaDelta" SDoc -> SDoc -> SDoc
<+> DeltaPos -> SDoc
deltaPos DeltaPos
d SDoc -> SDoc -> SDoc
<+> String -> SDoc
text String
"blanked"

            deltaPos :: DeltaPos -> SDoc
            deltaPos :: DeltaPos -> SDoc
deltaPos (SameLine Int
c) = SDoc -> SDoc
parens (SDoc -> SDoc) -> SDoc -> SDoc
forall a b. (a -> b) -> a -> b
$ String -> SDoc
text String
"SameLine" SDoc -> SDoc -> SDoc
<+> Int -> SDoc
forall a. Outputable a => a -> SDoc
ppr Int
c
            deltaPos (DifferentLine Int
l Int
c) = SDoc -> SDoc
parens (SDoc -> SDoc) -> SDoc -> SDoc
forall a b. (a -> b) -> a -> b
$ String -> SDoc
text String
"DifferentLine" SDoc -> SDoc -> SDoc
<+> Int -> SDoc
forall a. Outputable a => a -> SDoc
ppr Int
l SDoc -> SDoc -> SDoc
<+> Int -> SDoc
forall a. Outputable a => a -> SDoc
ppr Int
c

            name :: Name -> SDoc
            name :: Name -> SDoc
name Name
nm    = SDoc -> SDoc
braces (SDoc -> SDoc) -> SDoc -> SDoc
forall a b. (a -> b) -> a -> b
$ String -> SDoc
text String
"Name:" SDoc -> SDoc -> SDoc
<+> Name -> SDoc
forall a. Outputable a => a -> SDoc
ppr Name
nm

            occName :: OccName -> SDoc
occName OccName
n  =  SDoc -> SDoc
braces (SDoc -> SDoc) -> SDoc -> SDoc
forall a b. (a -> b) -> a -> b
$
                          String -> SDoc
text String
"OccName:"
                      SDoc -> SDoc -> SDoc
<+> String -> SDoc
text (OccName -> String
occNameString OccName
n)

            moduleName :: ModuleName -> SDoc
            moduleName :: ModuleName -> SDoc
moduleName ModuleName
m = SDoc -> SDoc
braces (SDoc -> SDoc) -> SDoc -> SDoc
forall a b. (a -> b) -> a -> b
$ String -> SDoc
text String
"ModuleName:" SDoc -> SDoc -> SDoc
<+> ModuleName -> SDoc
forall a. Outputable a => a -> SDoc
ppr ModuleName
m

            srcSpan :: SrcSpan -> SDoc
            srcSpan :: SrcSpan -> SDoc
srcSpan SrcSpan
ss = case BlankSrcSpan
bs of
             BlankSrcSpan
BlankSrcSpan -> String -> SDoc
text String
"{ ss }"
             BlankSrcSpan
NoBlankSrcSpan -> SDoc -> SDoc
braces (SDoc -> SDoc) -> SDoc -> SDoc
forall a b. (a -> b) -> a -> b
$ Char -> SDoc
char Char
' ' SDoc -> SDoc -> SDoc
<>
                             (SDoc -> Int -> SDoc -> SDoc
hang (SrcSpan -> SDoc
pprSrcSpanWithAnchor SrcSpan
ss) Int
1
                                   (String -> SDoc
text String
""))
             BlankSrcSpan
BlankSrcSpanFile -> SDoc -> SDoc
braces (SDoc -> SDoc) -> SDoc -> SDoc
forall a b. (a -> b) -> a -> b
$ Char -> SDoc
char Char
' ' SDoc -> SDoc -> SDoc
<>
                             (SDoc -> Int -> SDoc -> SDoc
hang (Bool -> SrcSpan -> SDoc
pprUserSpan Bool
False SrcSpan
ss) Int
1
                                   (String -> SDoc
text String
""))

            realSrcSpan :: RealSrcSpan -> SDoc
            realSrcSpan :: RealSrcSpan -> SDoc
realSrcSpan RealSrcSpan
ss = case BlankSrcSpan
bs of
             BlankSrcSpan
BlankSrcSpan -> String -> SDoc
text String
"{ ss }"
             BlankSrcSpan
NoBlankSrcSpan -> SDoc -> SDoc
braces (SDoc -> SDoc) -> SDoc -> SDoc
forall a b. (a -> b) -> a -> b
$ Char -> SDoc
char Char
' ' SDoc -> SDoc -> SDoc
<>
                             (SDoc -> Int -> SDoc -> SDoc
hang (RealSrcSpan -> SDoc
forall a. Outputable a => a -> SDoc
ppr RealSrcSpan
ss) Int
1
                                   (String -> SDoc
text String
""))
             BlankSrcSpan
BlankSrcSpanFile -> SDoc -> SDoc
braces (SDoc -> SDoc) -> SDoc -> SDoc
forall a b. (a -> b) -> a -> b
$ Char -> SDoc
char Char
' ' SDoc -> SDoc -> SDoc
<>
                             (SDoc -> Int -> SDoc -> SDoc
hang (Bool -> RealSrcSpan -> SDoc
pprUserRealSpan Bool
False RealSrcSpan
ss) Int
1
                                   (String -> SDoc
text String
""))


            addEpAnn :: AddEpAnn -> SDoc
            addEpAnn :: AddEpAnn -> SDoc
addEpAnn (AddEpAnn AnnKeywordId
a EpaLocation
s) = case BlankEpAnnotations
ba of
             BlankEpAnnotations
BlankEpAnnotations -> SDoc -> SDoc
parens
                                      (SDoc -> SDoc) -> SDoc -> SDoc
forall a b. (a -> b) -> a -> b
$ String -> SDoc
text String
"blanked:" SDoc -> SDoc -> SDoc
<+> String -> SDoc
text String
"AddEpAnn"
             BlankEpAnnotations
NoBlankEpAnnotations ->
              SDoc -> SDoc
parens (SDoc -> SDoc) -> SDoc -> SDoc
forall a b. (a -> b) -> a -> b
$ String -> SDoc
text String
"AddEpAnn" SDoc -> SDoc -> SDoc
<+> AnnKeywordId -> SDoc
forall a. Outputable a => a -> SDoc
ppr AnnKeywordId
a SDoc -> SDoc -> SDoc
<+> EpaLocation -> SDoc
epaAnchor EpaLocation
s

            var  :: Var -> SDoc
            var :: Var -> SDoc
var Var
v      = SDoc -> SDoc
braces (SDoc -> SDoc) -> SDoc -> SDoc
forall a b. (a -> b) -> a -> b
$ String -> SDoc
text String
"Var:" SDoc -> SDoc -> SDoc
<+> Var -> SDoc
forall a. Outputable a => a -> SDoc
ppr Var
v

            dataCon :: DataCon -> SDoc
            dataCon :: DataCon -> SDoc
dataCon DataCon
c  = SDoc -> SDoc
braces (SDoc -> SDoc) -> SDoc -> SDoc
forall a b. (a -> b) -> a -> b
$ String -> SDoc
text String
"DataCon:" SDoc -> SDoc -> SDoc
<+> DataCon -> SDoc
forall a. Outputable a => a -> SDoc
ppr DataCon
c

            bagRdrName:: Bag (LocatedA (HsBind GhcPs)) -> SDoc
            bagRdrName :: Bag (LocatedA (HsBind GhcPs)) -> SDoc
bagRdrName Bag (LocatedA (HsBind GhcPs))
bg =  SDoc -> SDoc
braces (SDoc -> SDoc) -> SDoc -> SDoc
forall a b. (a -> b) -> a -> b
$
                             String -> SDoc
text String
"Bag(LocatedA (HsBind GhcPs)):"
                          SDoc -> SDoc -> SDoc
$$ ([LocatedA (HsBind GhcPs)] -> SDoc
forall e. Data e => [e] -> SDoc
list ([LocatedA (HsBind GhcPs)] -> SDoc)
-> (Bag (LocatedA (HsBind GhcPs)) -> [LocatedA (HsBind GhcPs)])
-> Bag (LocatedA (HsBind GhcPs))
-> SDoc
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Bag (LocatedA (HsBind GhcPs)) -> [LocatedA (HsBind GhcPs)]
forall a. Bag a -> [a]
bagToList (Bag (LocatedA (HsBind GhcPs)) -> SDoc)
-> Bag (LocatedA (HsBind GhcPs)) -> SDoc
forall a b. (a -> b) -> a -> b
$ Bag (LocatedA (HsBind GhcPs))
bg)

            bagName   :: Bag (LocatedA (HsBind GhcRn)) -> SDoc
            bagName :: Bag (LocatedA (HsBind GhcRn)) -> SDoc
bagName Bag (LocatedA (HsBind GhcRn))
bg  =  SDoc -> SDoc
braces (SDoc -> SDoc) -> SDoc -> SDoc
forall a b. (a -> b) -> a -> b
$
                           String -> SDoc
text String
"Bag(LocatedA (HsBind Name)):"
                        SDoc -> SDoc -> SDoc
$$ ([LocatedA (HsBind GhcRn)] -> SDoc
forall e. Data e => [e] -> SDoc
list ([LocatedA (HsBind GhcRn)] -> SDoc)
-> (Bag (LocatedA (HsBind GhcRn)) -> [LocatedA (HsBind GhcRn)])
-> Bag (LocatedA (HsBind GhcRn))
-> SDoc
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Bag (LocatedA (HsBind GhcRn)) -> [LocatedA (HsBind GhcRn)]
forall a. Bag a -> [a]
bagToList (Bag (LocatedA (HsBind GhcRn)) -> SDoc)
-> Bag (LocatedA (HsBind GhcRn)) -> SDoc
forall a b. (a -> b) -> a -> b
$ Bag (LocatedA (HsBind GhcRn))
bg)

            bagVar    :: Bag (LocatedA (HsBind GhcTc)) -> SDoc
            bagVar :: Bag (LocatedA (HsBind GhcTc)) -> SDoc
bagVar Bag (LocatedA (HsBind GhcTc))
bg  =  SDoc -> SDoc
braces (SDoc -> SDoc) -> SDoc -> SDoc
forall a b. (a -> b) -> a -> b
$
                          String -> SDoc
text String
"Bag(LocatedA (HsBind Var)):"
                       SDoc -> SDoc -> SDoc
$$ ([LocatedA (HsBind GhcTc)] -> SDoc
forall e. Data e => [e] -> SDoc
list ([LocatedA (HsBind GhcTc)] -> SDoc)
-> (Bag (LocatedA (HsBind GhcTc)) -> [LocatedA (HsBind GhcTc)])
-> Bag (LocatedA (HsBind GhcTc))
-> SDoc
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Bag (LocatedA (HsBind GhcTc)) -> [LocatedA (HsBind GhcTc)]
forall a. Bag a -> [a]
bagToList (Bag (LocatedA (HsBind GhcTc)) -> SDoc)
-> Bag (LocatedA (HsBind GhcTc)) -> SDoc
forall a b. (a -> b) -> a -> b
$ Bag (LocatedA (HsBind GhcTc))
bg)

            nameSet :: NameSet -> SDoc
nameSet NameSet
ns =  SDoc -> SDoc
braces (SDoc -> SDoc) -> SDoc -> SDoc
forall a b. (a -> b) -> a -> b
$
                          String -> SDoc
text String
"NameSet:"
                       SDoc -> SDoc -> SDoc
$$ ([Name] -> SDoc
forall e. Data e => [e] -> SDoc
list ([Name] -> SDoc) -> (NameSet -> [Name]) -> NameSet -> SDoc
forall b c a. (b -> c) -> (a -> b) -> a -> c
. NameSet -> [Name]
nameSetElemsStable (NameSet -> SDoc) -> NameSet -> SDoc
forall a b. (a -> b) -> a -> b
$ NameSet
ns)

            fixity :: Fixity -> SDoc
            fixity :: Fixity -> SDoc
fixity Fixity
fx =  SDoc -> SDoc
braces (SDoc -> SDoc) -> SDoc -> SDoc
forall a b. (a -> b) -> a -> b
$
                         String -> SDoc
text String
"Fixity:"
                     SDoc -> SDoc -> SDoc
<+> Fixity -> SDoc
forall a. Outputable a => a -> SDoc
ppr Fixity
fx

            located :: (Data a, Data b) => GenLocated a b -> SDoc
            located :: forall d1 d2. (Data d1, Data d2) => GenLocated d1 d2 -> SDoc
located (L a
ss b
a)
              = SDoc -> SDoc
parens (String -> SDoc
text String
"L"
                        SDoc -> SDoc -> SDoc
$$ [SDoc] -> SDoc
vcat [a -> SDoc
forall a. Data a => a -> SDoc
showAstData' a
ss, b -> SDoc
forall a. Data a => a -> SDoc
showAstData' b
a])


            -- -------------------------

            annotation :: EpAnn [AddEpAnn] -> SDoc
            annotation :: EpAnn [AddEpAnn] -> SDoc
annotation = SDoc -> EpAnn [AddEpAnn] -> SDoc
forall a. Data a => SDoc -> EpAnn a -> SDoc
annotation' (String -> SDoc
text String
"EpAnn [AddEpAnn]")

            annotationModule :: EpAnn AnnsModule -> SDoc
            annotationModule :: EpAnn AnnsModule -> SDoc
annotationModule = SDoc -> EpAnn AnnsModule -> SDoc
forall a. Data a => SDoc -> EpAnn a -> SDoc
annotation' (String -> SDoc
text String
"EpAnn AnnsModule")

            annotationAddEpAnn :: EpAnn AddEpAnn -> SDoc
            annotationAddEpAnn :: EpAnn AddEpAnn -> SDoc
annotationAddEpAnn = SDoc -> EpAnn AddEpAnn -> SDoc
forall a. Data a => SDoc -> EpAnn a -> SDoc
annotation' (String -> SDoc
text String
"EpAnn AddEpAnn")

            annotationGrhsAnn :: EpAnn GrhsAnn -> SDoc
            annotationGrhsAnn :: EpAnn GrhsAnn -> SDoc
annotationGrhsAnn = SDoc -> EpAnn GrhsAnn -> SDoc
forall a. Data a => SDoc -> EpAnn a -> SDoc
annotation' (String -> SDoc
text String
"EpAnn GrhsAnn")

            annotationEpAnnHsCase :: EpAnn EpAnnHsCase -> SDoc
            annotationEpAnnHsCase :: EpAnn EpAnnHsCase -> SDoc
annotationEpAnnHsCase = SDoc -> EpAnn EpAnnHsCase -> SDoc
forall a. Data a => SDoc -> EpAnn a -> SDoc
annotation' (String -> SDoc
text String
"EpAnn EpAnnHsCase")

            annotationAnnList :: EpAnn AnnList -> SDoc
            annotationAnnList :: EpAnn AnnList -> SDoc
annotationAnnList = SDoc -> EpAnn AnnList -> SDoc
forall a. Data a => SDoc -> EpAnn a -> SDoc
annotation' (String -> SDoc
text String
"EpAnn AnnList")

            annotationEpAnnImportDecl :: EpAnn EpAnnImportDecl -> SDoc
            annotationEpAnnImportDecl :: EpAnn EpAnnImportDecl -> SDoc
annotationEpAnnImportDecl = SDoc -> EpAnn EpAnnImportDecl -> SDoc
forall a. Data a => SDoc -> EpAnn a -> SDoc
annotation' (String -> SDoc
text String
"EpAnn EpAnnImportDecl")

            annotationAnnParen :: EpAnn AnnParen -> SDoc
            annotationAnnParen :: EpAnn AnnParen -> SDoc
annotationAnnParen = SDoc -> EpAnn AnnParen -> SDoc
forall a. Data a => SDoc -> EpAnn a -> SDoc
annotation' (String -> SDoc
text String
"EpAnn AnnParen")

            annotationTrailingAnn :: EpAnn TrailingAnn -> SDoc
            annotationTrailingAnn :: EpAnn TrailingAnn -> SDoc
annotationTrailingAnn = SDoc -> EpAnn TrailingAnn -> SDoc
forall a. Data a => SDoc -> EpAnn a -> SDoc
annotation' (String -> SDoc
text String
"EpAnn TrailingAnn")

            annotationEpaLocation :: EpAnn EpaLocation -> SDoc
            annotationEpaLocation :: EpAnn EpaLocation -> SDoc
annotationEpaLocation = SDoc -> EpAnn EpaLocation -> SDoc
forall a. Data a => SDoc -> EpAnn a -> SDoc
annotation' (String -> SDoc
text String
"EpAnn EpaLocation")

            annotation' :: forall a .(Data a)
                       => SDoc -> EpAnn a -> SDoc
            annotation' :: forall a. Data a => SDoc -> EpAnn a -> SDoc
annotation' SDoc
tag EpAnn a
anns = case BlankEpAnnotations
ba of
             BlankEpAnnotations
BlankEpAnnotations -> SDoc -> SDoc
parens (String -> SDoc
text String
"blanked:" SDoc -> SDoc -> SDoc
<+> SDoc
tag)
             BlankEpAnnotations
NoBlankEpAnnotations -> SDoc -> SDoc
parens (SDoc -> SDoc) -> SDoc -> SDoc
forall a b. (a -> b) -> a -> b
$ String -> SDoc
text (Constr -> String
showConstr (EpAnn a -> Constr
forall a. Data a => a -> Constr
toConstr EpAnn a
anns))
                                               SDoc -> SDoc -> SDoc
$$ [SDoc] -> SDoc
vcat ((forall a. Data a => a -> SDoc) -> EpAnn a -> [SDoc]
forall a u. Data a => (forall d. Data d => d -> u) -> a -> [u]
forall u. (forall d. Data d => d -> u) -> EpAnn a -> [u]
gmapQ d -> SDoc
forall a. Data a => a -> SDoc
showAstData' EpAnn a
anns)

            -- -------------------------

            srcSpanAnnA :: SrcSpanAnn' (EpAnn AnnListItem) -> SDoc
            srcSpanAnnA :: SrcSpanAnn' (EpAnn AnnListItem) -> SDoc
srcSpanAnnA = SDoc -> SrcSpanAnn' (EpAnn AnnListItem) -> SDoc
forall a. Data a => SDoc -> SrcSpanAnn' a -> SDoc
locatedAnn'' (String -> SDoc
text String
"SrcSpanAnnA")

            srcSpanAnnL :: SrcSpanAnn' (EpAnn AnnList) -> SDoc
            srcSpanAnnL :: SrcSpanAnn' (EpAnn AnnList) -> SDoc
srcSpanAnnL = SDoc -> SrcSpanAnn' (EpAnn AnnList) -> SDoc
forall a. Data a => SDoc -> SrcSpanAnn' a -> SDoc
locatedAnn'' (String -> SDoc
text String
"SrcSpanAnnL")

            srcSpanAnnP :: SrcSpanAnn' (EpAnn AnnPragma) -> SDoc
            srcSpanAnnP :: SrcSpanAnn' (EpAnn AnnPragma) -> SDoc
srcSpanAnnP = SDoc -> SrcSpanAnn' (EpAnn AnnPragma) -> SDoc
forall a. Data a => SDoc -> SrcSpanAnn' a -> SDoc
locatedAnn'' (String -> SDoc
text String
"SrcSpanAnnP")

            srcSpanAnnC :: SrcSpanAnn' (EpAnn AnnContext) -> SDoc
            srcSpanAnnC :: SrcSpanAnn' (EpAnn AnnContext) -> SDoc
srcSpanAnnC = SDoc -> SrcSpanAnn' (EpAnn AnnContext) -> SDoc
forall a. Data a => SDoc -> SrcSpanAnn' a -> SDoc
locatedAnn'' (String -> SDoc
text String
"SrcSpanAnnC")

            srcSpanAnnN :: SrcSpanAnn' (EpAnn NameAnn) -> SDoc
            srcSpanAnnN :: SrcSpanAnn' (EpAnn NameAnn) -> SDoc
srcSpanAnnN = SDoc -> SrcSpanAnn' (EpAnn NameAnn) -> SDoc
forall a. Data a => SDoc -> SrcSpanAnn' a -> SDoc
locatedAnn'' (String -> SDoc
text String
"SrcSpanAnnN")

            locatedAnn'' :: forall a. (Data a)
              => SDoc -> SrcSpanAnn' a -> SDoc
            locatedAnn'' :: forall a. Data a => SDoc -> SrcSpanAnn' a -> SDoc
locatedAnn'' SDoc
tag SrcSpanAnn' a
ss = SDoc -> SDoc
parens (SDoc -> SDoc) -> SDoc -> SDoc
forall a b. (a -> b) -> a -> b
$
              case SrcSpanAnn' a -> Maybe (SrcSpanAnn' a)
forall a b. (Typeable a, Typeable b) => a -> Maybe b
cast SrcSpanAnn' a
ss of
                Just ((SrcSpanAnn a
ann SrcSpan
s) :: SrcSpanAnn' a) ->
                  case BlankEpAnnotations
ba of
                    BlankEpAnnotations
BlankEpAnnotations
                      -> SDoc -> SDoc
parens (String -> SDoc
text String
"blanked:" SDoc -> SDoc -> SDoc
<+> SDoc
tag)
                    BlankEpAnnotations
NoBlankEpAnnotations
                      -> String -> SDoc
text String
"SrcSpanAnn" SDoc -> SDoc -> SDoc
<+> a -> SDoc
forall a. Data a => a -> SDoc
showAstData' a
ann
                              SDoc -> SDoc -> SDoc
<+> SrcSpan -> SDoc
srcSpan SrcSpan
s
                Maybe (SrcSpanAnn' a)
Nothing -> String -> SDoc
text String
"locatedAnn:unmatched" SDoc -> SDoc -> SDoc
<+> SDoc
tag
                           SDoc -> SDoc -> SDoc
<+> (SDoc -> SDoc
parens (SDoc -> SDoc) -> SDoc -> SDoc
forall a b. (a -> b) -> a -> b
$ String -> SDoc
text (Constr -> String
showConstr (SrcSpanAnn' a -> Constr
forall a. Data a => a -> Constr
toConstr SrcSpanAnn' a
ss)))


normalize_newlines :: String -> String
normalize_newlines :: ShowS
normalize_newlines (Char
'\\':Char
'r':Char
'\\':Char
'n':String
xs) = Char
'\\'Char -> ShowS
forall a. a -> [a] -> [a]
:Char
'n'Char -> ShowS
forall a. a -> [a] -> [a]
:ShowS
normalize_newlines String
xs
normalize_newlines (Char
x:String
xs)                 = Char
xChar -> ShowS
forall a. a -> [a] -> [a]
:ShowS
normalize_newlines String
xs
normalize_newlines []                     = []

pprSrcSpanWithAnchor :: SrcSpan -> SDoc
pprSrcSpanWithAnchor :: SrcSpan -> SDoc
pprSrcSpanWithAnchor ss :: SrcSpan
ss@(UnhelpfulSpan UnhelpfulSpanReason
_) = SrcSpan -> SDoc
forall a. Outputable a => a -> SDoc
ppr SrcSpan
ss
pprSrcSpanWithAnchor SrcSpan
ss = SrcSpan -> SDoc
forall a. Outputable a => a -> SDoc
ppr SrcSpan
ss SDoc -> SDoc -> SDoc
<+> SDoc -> SDoc
parens (Anchor -> SDoc
forall a. Outputable a => a -> SDoc
ppr (SrcSpan -> Anchor
hackSrcSpanToAnchor SrcSpan
ss))