    {-
    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.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
    forall doc. IsDoc doc => doc -> doc -> doc
    $$ 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 r.
    (Typeable a, Typeable b) =>
    (a -> r) -> (b -> r) -> a -> r
    `extQ` String -> SDoc
    string (a -> SDoc) -> (FastString -> SDoc) -> a -> SDoc
    forall a b r.
    (Typeable a, Typeable b) =>
    (a -> r) -> (b -> r) -> a -> r
    `extQ` FastString -> SDoc
    fastString (a -> SDoc) -> (SrcSpan -> SDoc) -> a -> SDoc
    forall a b r.
    (Typeable a, Typeable b) =>
    (a -> r) -> (b -> r) -> a -> r
    `extQ` SrcSpan -> SDoc
    srcSpan (a -> SDoc) -> (RealSrcSpan -> SDoc) -> a -> SDoc
    forall a b r.
    (Typeable a, Typeable b) =>
    (a -> r) -> (b -> r) -> a -> r
    `extQ` RealSrcSpan -> SDoc
    realSrcSpan
                  (a -> SDoc) -> (EpAnn [AddEpAnn] -> SDoc) -> a -> SDoc
    forall a b r.
    (Typeable a, Typeable b) =>
    (a -> r) -> (b -> r) -> a -> r
    `extQ` EpAnn [AddEpAnn] -> SDoc
    annotation
                  (a -> SDoc) -> (EpAnn AnnsModule -> SDoc) -> a -> SDoc
    forall a b r.
    (Typeable a, Typeable b) =>
    (a -> r) -> (b -> r) -> a -> r
    `extQ` EpAnn AnnsModule -> SDoc
    annotationModule
                  (a -> SDoc) -> (EpAnn AddEpAnn -> SDoc) -> a -> SDoc
    forall a b r.
    (Typeable a, Typeable b) =>
    (a -> r) -> (b -> r) -> a -> r
    `extQ` EpAnn AddEpAnn -> SDoc
    annotationAddEpAnn
                  (a -> SDoc) -> (EpAnn GrhsAnn -> SDoc) -> a -> SDoc
    forall a b r.
    (Typeable a, Typeable b) =>
    (a -> r) -> (b -> r) -> a -> r
    `extQ` EpAnn GrhsAnn -> SDoc
    annotationGrhsAnn
                  (a -> SDoc) -> (EpAnn EpAnnHsCase -> SDoc) -> a -> SDoc
    forall a b r.
    (Typeable a, Typeable b) =>
    (a -> r) -> (b -> r) -> a -> r
    `extQ` EpAnn EpAnnHsCase -> SDoc
    annotationEpAnnHsCase
                  (a -> SDoc) -> (EpAnn AnnList -> SDoc) -> a -> SDoc
    forall a b r.
    (Typeable a, Typeable b) =>
    (a -> r) -> (b -> r) -> a -> r
    `extQ` EpAnn AnnList -> SDoc
    annotationAnnList
                  (a -> SDoc) -> (EpAnn EpAnnImportDecl -> SDoc) -> a -> SDoc
    forall a b r.
    (Typeable a, Typeable b) =>
    (a -> r) -> (b -> r) -> a -> r
    `extQ` EpAnn EpAnnImportDecl -> SDoc
    annotationEpAnnImportDecl
                  (a -> SDoc) -> (EpAnn AnnParen -> SDoc) -> a -> SDoc
    forall a b r.
    (Typeable a, Typeable b) =>
    (a -> r) -> (b -> r) -> a -> r
    `extQ` EpAnn AnnParen -> SDoc
    annotationAnnParen
                  (a -> SDoc) -> (EpAnn TrailingAnn -> SDoc) -> a -> SDoc
    forall a b r.
    (Typeable a, Typeable b) =>
    (a -> r) -> (b -> r) -> a -> r
    `extQ` EpAnn TrailingAnn -> SDoc
    annotationTrailingAnn
                  (a -> SDoc) -> (EpAnn EpaLocation -> SDoc) -> a -> SDoc
    forall a b r.
    (Typeable a, Typeable b) =>
    (a -> r) -> (b -> r) -> a -> r
    `extQ` EpAnn EpaLocation -> SDoc
    annotationEpaLocation
                  (a -> SDoc) -> (AddEpAnn -> SDoc) -> a -> SDoc
    forall a b r.
    (Typeable a, Typeable b) =>
    (a -> r) -> (b -> r) -> a -> r
    `extQ` AddEpAnn -> SDoc
    addEpAnn
                  (a -> SDoc) -> (HsLit GhcPs -> SDoc) -> a -> SDoc
    forall a b r.
    (Typeable a, Typeable b) =>
    (a -> r) -> (b -> r) -> a -> r
    `extQ` HsLit GhcPs -> SDoc
    lit (a -> SDoc) -> (HsLit GhcRn -> SDoc) -> a -> SDoc
    forall a b r.
    (Typeable a, Typeable b) =>
    (a -> r) -> (b -> r) -> a -> r
    `extQ` HsLit GhcRn -> SDoc
    litr (a -> SDoc) -> (HsLit GhcTc -> SDoc) -> a -> SDoc
    forall a b r.
    (Typeable a, Typeable b) =>
    (a -> r) -> (b -> r) -> a -> r
    `extQ` HsLit GhcTc -> SDoc
    litt
                  (a -> SDoc) -> (SourceText -> SDoc) -> a -> SDoc
    forall a b r.
    (Typeable a, Typeable b) =>
    (a -> r) -> (b -> r) -> a -> r
    `extQ` SourceText -> SDoc
    sourceText
                  (a -> SDoc) -> (DeltaPos -> SDoc) -> a -> SDoc
    forall a b r.
    (Typeable a, Typeable b) =>
    (a -> r) -> (b -> r) -> a -> r
    `extQ` DeltaPos -> SDoc
    deltaPos
                  (a -> SDoc) -> (EpaLocation -> SDoc) -> a -> SDoc
    forall a b r.
    (Typeable a, Typeable b) =>
    (a -> r) -> (b -> r) -> a -> r
    `extQ` EpaLocation -> SDoc
    epaAnchor
                  (a -> SDoc) -> (ByteString -> SDoc) -> a -> SDoc
    forall a b r.
    (Typeable a, Typeable b) =>
    (a -> r) -> (b -> r) -> a -> r
    `extQ` ByteString -> SDoc
    bytestring
                  (a -> SDoc) -> (Name -> SDoc) -> a -> SDoc
    forall a b r.
    (Typeable a, Typeable b) =>
    (a -> r) -> (b -> r) -> a -> r
    `extQ` Name -> SDoc
    name (a -> SDoc) -> (OccName -> SDoc) -> a -> SDoc
    forall a b r.
    (Typeable a, Typeable b) =>
    (a -> r) -> (b -> r) -> a -> r
    `extQ` OccName -> SDoc
    forall {doc}. IsLine doc => OccName -> doc
    occName (a -> SDoc) -> (ModuleName -> SDoc) -> a -> SDoc
    forall a b r.
    (Typeable a, Typeable b) =>
    (a -> r) -> (b -> r) -> a -> r
    `extQ` ModuleName -> SDoc
    moduleName (a -> SDoc) -> (Var -> SDoc) -> a -> SDoc
    forall a b r.
    (Typeable a, Typeable b) =>
    (a -> r) -> (b -> r) -> a -> r
    `extQ` Var -> SDoc
    var
                  (a -> SDoc) -> (DataCon -> SDoc) -> a -> SDoc
    forall a b r.
    (Typeable a, Typeable b) =>
    (a -> r) -> (b -> r) -> a -> r
    `extQ` DataCon -> SDoc
    dataCon
                  (a -> SDoc) -> (Bag (LocatedA (HsBind GhcRn)) -> SDoc) -> a -> SDoc
    forall a b r.
    (Typeable a, Typeable b) =>
    (a -> r) -> (b -> r) -> a -> r
    `extQ` Bag (LocatedA (HsBind GhcRn)) -> SDoc
    bagName (a -> SDoc) -> (Bag (LocatedA (HsBind GhcPs)) -> SDoc) -> a -> SDoc
    forall a b r.
    (Typeable a, Typeable b) =>
    (a -> r) -> (b -> r) -> a -> r
    `extQ` Bag (LocatedA (HsBind GhcPs)) -> SDoc
    bagRdrName (a -> SDoc) -> (Bag (LocatedA (HsBind GhcTc)) -> SDoc) -> a -> SDoc
    forall a b r.
    (Typeable a, Typeable b) =>
    (a -> r) -> (b -> r) -> a -> r
    `extQ` Bag (LocatedA (HsBind GhcTc)) -> SDoc
    bagVar (a -> SDoc) -> (NameSet -> SDoc) -> a -> SDoc
    forall a b r.
    (Typeable a, Typeable b) =>
    (a -> r) -> (b -> r) -> a -> r
    `extQ` NameSet -> SDoc
    nameSet
                  (a -> SDoc) -> (Fixity -> SDoc) -> a -> SDoc
    forall a b r.
    (Typeable a, Typeable b) =>
    (a -> r) -> (b -> r) -> a -> r
    `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 r.
    (Typeable a, Typeable b) =>
    (a -> r) -> (b -> r) -> a -> r
    `extQ` SrcSpanAnn' (EpAnn AnnListItem) -> SDoc
    srcSpanAnnA
                  (a -> SDoc) -> (SrcSpanAnn' (EpAnn AnnList) -> SDoc) -> a -> SDoc
    forall a b r.
    (Typeable a, Typeable b) =>
    (a -> r) -> (b -> r) -> a -> r
    `extQ` SrcSpanAnn' (EpAnn AnnList) -> SDoc
    srcSpanAnnL
                  (a -> SDoc) -> (SrcSpanAnn' (EpAnn AnnPragma) -> SDoc) -> a -> SDoc
    forall a b r.
    (Typeable a, Typeable b) =>
    (a -> r) -> (b -> r) -> a -> r
    `extQ` SrcSpanAnn' (EpAnn AnnPragma) -> SDoc
    srcSpanAnnP
                  (a -> SDoc)
    -> (SrcSpanAnn' (EpAnn AnnContext) -> SDoc) -> a -> SDoc
    forall a b r.
    (Typeable a, Typeable b) =>
    (a -> r) -> (b -> r) -> a -> r
    `extQ` SrcSpanAnn' (EpAnn AnnContext) -> SDoc
    srcSpanAnnC
                  (a -> SDoc) -> (SrcSpanAnn' (EpAnn NameAnn) -> SDoc) -> a -> SDoc
    forall a b r.
    (Typeable a, Typeable b) =>
    (a -> r) -> (b -> r) -> a -> r
    `extQ` SrcSpanAnn' (EpAnn NameAnn) -> SDoc
    srcSpanAnnN

          where generic :: Data a => a -> SDoc
                generic :: forall a. Data a => a -> SDoc
    generic a
    t = SDoc -> SDoc
    forall doc. IsLine doc => doc -> doc
    parens (SDoc -> SDoc) -> SDoc -> SDoc
    forall a b. (a -> b) -> a -> b
    $ String -> SDoc
    forall doc. IsLine doc => String -> doc
    text (Constr -> String
    showConstr (a -> Constr
    forall a. Data a => a -> Constr
    toConstr a
    t))
                                      SDoc -> SDoc -> SDoc
    forall doc. IsDoc doc => doc -> doc -> doc
    $$ [SDoc] -> SDoc
    forall doc. IsDoc doc => [doc] -> doc
    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
    forall doc. IsLine doc => String -> doc
    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
    forall doc. IsLine doc => doc -> doc
    braces (SDoc -> SDoc) -> SDoc -> SDoc
    forall a b. (a -> b) -> a -> b
    $
                                String -> SDoc
    forall doc. IsLine doc => String -> doc
    text String
    "FastString:"
                            SDoc -> SDoc -> SDoc
    forall doc. IsLine doc => doc -> doc -> doc
    <+> String -> SDoc
    forall doc. IsLine doc => String -> doc
    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
    forall doc. IsLine doc => String -> doc
    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
    forall doc. IsLine doc => doc -> doc
    brackets SDoc
    forall doc. IsOutput doc => doc
    empty
                list [t
    x]   = SDoc -> SDoc
    forall doc. IsLine doc => doc -> doc
    brackets (t -> SDoc
    forall a. Data a => a -> SDoc
    showAstData' t
    x)
                list (t
    x1 : t
    x2 : [t]
    xs) =  (String -> SDoc
    forall doc. IsLine doc => String -> doc
    text String
    "[" SDoc -> SDoc -> SDoc
    forall doc. IsLine doc => doc -> doc -> doc
    <> t -> SDoc
    forall a. Data a => a -> SDoc
    showAstData' t
    x1)
                                    SDoc -> SDoc -> SDoc
    forall doc. IsDoc doc => doc -> doc -> doc
    $$ 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
    forall doc. IsLine doc => String -> doc
    text String
    "," SDoc -> SDoc -> SDoc
    forall doc. IsLine doc => doc -> doc -> doc
    <> t -> SDoc
    forall a. Data a => a -> SDoc
    showAstData' t
    y SDoc -> SDoc -> SDoc
    forall doc. IsLine doc => doc -> doc -> doc
    <> String -> SDoc
    forall doc. IsLine doc => String -> doc
    text String
    "]"
                    go t
    y1 (t
    y2 : [t]
    ys) = (String -> SDoc
    forall doc. IsLine doc => String -> doc
    text String
    "," SDoc -> SDoc -> SDoc
    forall doc. IsLine doc => doc -> doc -> doc
    <> t -> SDoc
    forall a. Data a => a -> SDoc
    showAstData' t
    y1) SDoc -> SDoc -> SDoc
    forall doc. IsDoc doc => doc -> doc -> doc
    $$ 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
    forall doc. IsLine doc => doc -> doc
    braces (SDoc -> SDoc) -> SDoc -> SDoc
    forall a b. (a -> b) -> a -> b
    $ [SDoc] -> SDoc
    forall doc. IsLine doc => [doc] -> doc
    hsep [ String -> SDoc
    forall doc. IsLine doc => String -> doc
    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
    forall doc. IsLine doc => doc -> doc
    parens (SDoc -> SDoc) -> SDoc -> SDoc
    forall a b. (a -> b) -> a -> b
    $ String -> SDoc
    forall doc. IsLine doc => String -> doc
    text String
    "NoSourceText"
                sourceText (SourceText String
    src) = case BlankSrcSpan
    bs of
                  BlankSrcSpan
    NoBlankSrcSpan   -> SDoc -> SDoc
    forall doc. IsLine doc => doc -> doc
    parens (SDoc -> SDoc) -> SDoc -> SDoc
    forall a b. (a -> b) -> a -> b
    $ String -> SDoc
    forall doc. IsLine doc => String -> doc
    text String
    "SourceText" SDoc -> SDoc -> SDoc
    forall doc. IsLine doc => doc -> doc -> doc
    <+> String -> SDoc
    forall doc. IsLine doc => String -> doc
    text String
    src
                  BlankSrcSpan
    BlankSrcSpanFile -> SDoc -> SDoc
    forall doc. IsLine doc => doc -> doc
    parens (SDoc -> SDoc) -> SDoc -> SDoc
    forall a b. (a -> b) -> a -> b
    $ String -> SDoc
    forall doc. IsLine doc => String -> doc
    text String
    "SourceText" SDoc -> SDoc -> SDoc
    forall doc. IsLine doc => doc -> doc -> doc
    <+> String -> SDoc
    forall doc. IsLine doc => String -> doc
    text String
    src
                  BlankSrcSpan
    _                -> SDoc -> SDoc
    forall doc. IsLine doc => doc -> doc
    parens (SDoc -> SDoc) -> SDoc -> SDoc
    forall a b. (a -> b) -> a -> b
    $ String -> SDoc
    forall doc. IsLine doc => String -> doc
    text String
    "SourceText" SDoc -> SDoc -> SDoc
    forall doc. IsLine doc => doc -> doc -> doc
    <+> String -> SDoc
    forall doc. IsLine doc => String -> doc
    text String
    "blanked"

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

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

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

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

                moduleName :: ModuleName -> SDoc
                moduleName :: ModuleName -> SDoc
    moduleName ModuleName
    m = SDoc -> SDoc
    forall doc. IsLine doc => doc -> doc
    braces (SDoc -> SDoc) -> SDoc -> SDoc
    forall a b. (a -> b) -> a -> b
    $ String -> SDoc
    forall doc. IsLine doc => String -> doc
    text String
    "ModuleName:" SDoc -> SDoc -> SDoc
    forall doc. IsLine doc => doc -> doc -> doc
    <+> 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
    forall doc. IsLine doc => String -> doc
    text String
    "{ ss }"
                 BlankSrcSpan
    NoBlankSrcSpan -> SDoc -> SDoc
    forall doc. IsLine doc => doc -> doc
    braces (SDoc -> SDoc) -> SDoc -> SDoc
    forall a b. (a -> b) -> a -> b
    $ Char -> SDoc
    forall doc. IsLine doc => Char -> doc
    char Char
    ' ' SDoc -> SDoc -> SDoc
    forall doc. IsLine doc => doc -> doc -> doc
    <>
                                 (SDoc -> Int -> SDoc -> SDoc
    hang (SrcSpan -> SDoc
    pprSrcSpanWithAnchor SrcSpan
    ss) Int
    1
                                       (String -> SDoc
    forall doc. IsLine doc => String -> doc
    text String
    ""))
                 BlankSrcSpan
    BlankSrcSpanFile -> SDoc -> SDoc
    forall doc. IsLine doc => doc -> doc
    braces (SDoc -> SDoc) -> SDoc -> SDoc
    forall a b. (a -> b) -> a -> b
    $ Char -> SDoc
    forall doc. IsLine doc => Char -> doc
    char Char
    ' ' SDoc -> SDoc -> SDoc
    forall doc. IsLine doc => doc -> doc -> doc
    <>
                                 (SDoc -> Int -> SDoc -> SDoc
    hang (Bool -> SrcSpan -> SDoc
    pprUserSpan Bool
    False SrcSpan
    ss) Int
    1
                                       (String -> SDoc
    forall doc. IsLine doc => String -> doc
    text String
    ""))

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

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

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

                dataCon :: DataCon -> SDoc
                dataCon :: DataCon -> SDoc
    dataCon DataCon
    c  = SDoc -> SDoc
    forall doc. IsLine doc => doc -> doc
    braces (SDoc -> SDoc) -> SDoc -> SDoc
    forall a b. (a -> b) -> a -> b
    $ String -> SDoc
    forall doc. IsLine doc => String -> doc
    text String
    "DataCon:" SDoc -> SDoc -> SDoc
    forall doc. IsLine doc => doc -> doc -> doc
    <+> 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
    forall doc. IsLine doc => doc -> doc
    braces (SDoc -> SDoc) -> SDoc -> SDoc
    forall a b. (a -> b) -> a -> b
    $
                                 String -> SDoc
    forall doc. IsLine doc => String -> doc
    text String
    "Bag(LocatedA (HsBind GhcPs)):"
                              SDoc -> SDoc -> SDoc
    forall doc. IsDoc doc => doc -> doc -> doc
    $$ ([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
    forall doc. IsLine doc => doc -> doc
    braces (SDoc -> SDoc) -> SDoc -> SDoc
    forall a b. (a -> b) -> a -> b
    $
                               String -> SDoc
    forall doc. IsLine doc => String -> doc
    text String
    "Bag(LocatedA (HsBind Name)):"
                            SDoc -> SDoc -> SDoc
    forall doc. IsDoc doc => doc -> doc -> doc
    $$ ([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
    forall doc. IsLine doc => doc -> doc
    braces (SDoc -> SDoc) -> SDoc -> SDoc
    forall a b. (a -> b) -> a -> b
    $
                              String -> SDoc
    forall doc. IsLine doc => String -> doc
    text String
    "Bag(LocatedA (HsBind Var)):"
                           SDoc -> SDoc -> SDoc
    forall doc. IsDoc doc => doc -> doc -> doc
    $$ ([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
    forall doc. IsLine doc => doc -> doc
    braces (SDoc -> SDoc) -> SDoc -> SDoc
    forall a b. (a -> b) -> a -> b
    $
                              String -> SDoc
    forall doc. IsLine doc => String -> doc
    text String
    "NameSet:"
                           SDoc -> SDoc -> SDoc
    forall doc. IsDoc doc => doc -> doc -> doc
    $$ ([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
    forall doc. IsLine doc => doc -> doc
    braces (SDoc -> SDoc) -> SDoc -> SDoc
    forall a b. (a -> b) -> a -> b
    $
                             String -> SDoc
    forall doc. IsLine doc => String -> doc
    text String
    "Fixity:"
                         SDoc -> SDoc -> SDoc
    forall doc. IsLine doc => doc -> doc -> doc
    <+> 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
    forall doc. IsLine doc => doc -> doc
    parens (String -> SDoc
    forall doc. IsLine doc => String -> doc
    text String
    "L"
                            SDoc -> SDoc -> SDoc
    forall doc. IsDoc doc => doc -> doc -> doc
    $$ [SDoc] -> SDoc
    forall doc. IsDoc doc => [doc] -> doc
    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
    forall doc. IsLine doc => String -> doc
    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
    forall doc. IsLine doc => String -> doc
    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
    forall doc. IsLine doc => String -> doc
    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
    forall doc. IsLine doc => String -> doc
    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
    forall doc. IsLine doc => String -> doc
    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
    forall doc. IsLine doc => String -> doc
    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
    forall doc. IsLine doc => String -> doc
    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
    forall doc. IsLine doc => String -> doc
    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
    forall doc. IsLine doc => String -> doc
    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
    forall doc. IsLine doc => String -> doc
    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
    forall doc. IsLine doc => doc -> doc
    parens (String -> SDoc
    forall doc. IsLine doc => String -> doc
    text String
    "blanked:" SDoc -> SDoc -> SDoc
    forall doc. IsLine doc => doc -> doc -> doc
    <+> SDoc
    tag)
                 BlankEpAnnotations
    NoBlankEpAnnotations -> SDoc -> SDoc
    forall doc. IsLine doc => doc -> doc
    parens (SDoc -> SDoc) -> SDoc -> SDoc
    forall a b. (a -> b) -> a -> b
    $ String -> SDoc
    forall doc. IsLine doc => String -> doc
    text (Constr -> String
    showConstr (EpAnn a -> Constr
    forall a. Data a => a -> Constr
    toConstr EpAnn a
    anns))
                                                   SDoc -> SDoc -> SDoc
    forall doc. IsDoc doc => doc -> doc -> doc
    $$ [SDoc] -> SDoc
    forall doc. IsDoc doc => [doc] -> doc
    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
    forall doc. IsLine doc => String -> doc
    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
    forall doc. IsLine doc => String -> doc
    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
    forall doc. IsLine doc => String -> doc
    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
    forall doc. IsLine doc => String -> doc
    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
    forall doc. IsLine doc => String -> doc
    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
    forall doc. IsLine doc => doc -> doc
    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
    forall doc. IsLine doc => doc -> doc
    parens (String -> SDoc
    forall doc. IsLine doc => String -> doc
    text String
    "blanked:" SDoc -> SDoc -> SDoc
    forall doc. IsLine doc => doc -> doc -> doc
    <+> SDoc
    tag)
                        BlankEpAnnotations
    NoBlankEpAnnotations
                          -> String -> SDoc
    forall doc. IsLine doc => String -> doc
    text String
    "SrcSpanAnn" SDoc -> SDoc -> SDoc
    forall doc. IsLine doc => doc -> doc -> doc
    <+> a -> SDoc
    forall a. Data a => a -> SDoc
    showAstData' a
    ann
                                  SDoc -> SDoc -> SDoc
    forall doc. IsLine doc => doc -> doc -> doc
    <+> SrcSpan -> SDoc
    srcSpan SrcSpan
    s
                    Maybe (SrcSpanAnn' a)
    Nothing -> String -> SDoc
    forall doc. IsLine doc => String -> doc
    text String
    "locatedAnn:unmatched" SDoc -> SDoc -> SDoc
    forall doc. IsLine doc => doc -> doc -> doc
    <+> SDoc
    tag
                               SDoc -> SDoc -> SDoc
    forall doc. IsLine doc => doc -> doc -> doc
    <+> (SDoc -> SDoc
    forall doc. IsLine doc => doc -> doc
    parens (SDoc -> SDoc) -> SDoc -> SDoc
    forall a b. (a -> b) -> a -> b
    $ String -> SDoc
    forall doc. IsLine doc => String -> doc
    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
    forall doc. IsLine doc => doc -> doc -> doc
    <+> SDoc -> SDoc
    forall doc. IsLine doc => doc -> doc
    parens (Anchor -> SDoc
    forall a. Outputable a => a -> SDoc
    ppr (SrcSpan -> Anchor
    hackSrcSpanToAnchor SrcSpan
    ss))