    {-
    (c) The University of Glasgow 2006
    (c) The GRASP/AQUA Project, Glasgow University, 1992-1998
    -}
    {-# LANGUAGE RankNTypes #-}
    {-# LANGUAGE ScopedTypeVariables #-}

    -- | Contains a debug function to dump parts of the GHC.Hs AST. It uses a syb
    -- traversal which falls back to displaying based on the constructor name, so
    -- can be used to dump anything having a @Data.Data@ instance.

    module GHC.Hs.Dump (
            -- * Dumping ASTs
            showAstData,
            showAstDataFull,
            BlankSrcSpan(..),
            BlankEpAnnotations(..),
        ) where

    import GHC.Prelude

    import GHC.Hs

    import GHC.Core.DataCon

    import GHC.Data.Bag
    import GHC.Data.FastString
    import GHC.Types.Name.Set
    import GHC.Types.Name
    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

    -- | Should source spans be removed from output.
    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)

    -- | Should EpAnnotations be removed from output.
    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 the full AST as the compiler sees it.
    showAstDataFull :: Data a => a -> SDoc
    showAstDataFull :: forall a. Data a => a -> SDoc
    showAstDataFull = BlankSrcSpan -> BlankEpAnnotations -> a -> SDoc
    forall a. Data a => BlankSrcSpan -> BlankEpAnnotations -> a -> SDoc
    showAstData BlankSrcSpan
    NoBlankSrcSpan BlankEpAnnotations
    NoBlankEpAnnotations

    -- | 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) -> ([AddEpAnn] -> SDoc) -> a -> SDoc
    forall a b q.
    (Typeable a, Typeable b) =>
    (a -> q) -> (b -> q) -> a -> q
    `extQ` [AddEpAnn] -> SDoc
    list_addEpAnn
                  (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) -> (EpAnn NoEpAnns -> SDoc) -> a -> SDoc
    forall a b q.
    (Typeable a, Typeable b) =>
    (a -> q) -> (b -> q) -> a -> q
    `extQ` EpAnn NoEpAnns -> SDoc
    annotationNoEpAnns
                  (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) -> (AnnParen -> SDoc) -> a -> SDoc
    forall a b q.
    (Typeable a, Typeable b) =>
    (a -> q) -> (b -> q) -> a -> q
    `extQ` AnnParen -> SDoc
    annParen
                  (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
    forall {doc}. IsLine doc => OccName -> doc
    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) -> (EpAnn AnnListItem -> SDoc) -> a -> SDoc
    forall a b q.
    (Typeable a, Typeable b) =>
    (a -> q) -> (b -> q) -> a -> q
    `extQ` EpAnn AnnListItem -> SDoc
    srcSpanAnnA
                  (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
    srcSpanAnnL
                  (a -> SDoc) -> (EpAnn AnnPragma -> SDoc) -> a -> SDoc
    forall a b q.
    (Typeable a, Typeable b) =>
    (a -> q) -> (b -> q) -> a -> q
    `extQ` EpAnn AnnPragma -> SDoc
    srcSpanAnnP
                  (a -> SDoc) -> (EpAnn AnnContext -> SDoc) -> a -> SDoc
    forall a b q.
    (Typeable a, Typeable b) =>
    (a -> q) -> (b -> q) -> a -> q
    `extQ` EpAnn AnnContext -> SDoc
    srcSpanAnnC
                  (a -> SDoc) -> (EpAnn NameAnn -> SDoc) -> a -> SDoc
    forall a b q.
    (Typeable a, Typeable b) =>
    (a -> q) -> (b -> q) -> a -> q
    `extQ` 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_addEpAnn :: [AddEpAnn] -> SDoc
                list_addEpAnn :: [AddEpAnn] -> SDoc
    list_addEpAnn [AddEpAnn]
    ls = 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 -> [AddEpAnn] -> SDoc
    forall e. Data e => [e] -> SDoc
    list [AddEpAnn]
    ls

                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 FastString
    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
    <+> FastString -> SDoc
    forall doc. IsLine doc => FastString -> doc
    ftext FastString
    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
    <+> FastString -> SDoc
    forall doc. IsLine doc => FastString -> doc
    ftext FastString
    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 SrcSpan
    s) = 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
    <+> SrcSpan -> SDoc
    srcSpan SrcSpan
    s
                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
    <+> FastString -> doc
    forall doc. IsLine doc => FastString -> doc
    ftext (OccName -> FastString
    occNameFS 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
    <> (SrcSpan -> SDoc
    forall a. Outputable a => a -> SDoc
    ppr SrcSpan
    ss) SDoc -> SDoc -> SDoc
    forall doc. IsLine doc => doc -> doc -> doc
    <> Char -> SDoc
    forall doc. IsLine doc => Char -> doc
    char Char
    ' '
                 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
    <> (Bool -> SrcSpan -> SDoc
    pprUserSpan Bool
    False SrcSpan
    ss) SDoc -> SDoc -> SDoc
    forall doc. IsLine doc => doc -> doc -> doc
    <> Char -> SDoc
    forall doc. IsLine doc => Char -> doc
    char Char
    ' '

                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
    <> (RealSrcSpan -> SDoc
    forall a. Outputable a => a -> SDoc
    ppr RealSrcSpan
    ss) SDoc -> SDoc -> SDoc
    forall doc. IsLine doc => doc -> doc -> doc
    <> Char -> SDoc
    forall doc. IsLine doc => Char -> doc
    char Char
    ' '
                 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
    <> (Bool -> RealSrcSpan -> SDoc
    pprUserRealSpan Bool
    False RealSrcSpan
    ss) SDoc -> SDoc -> SDoc
    forall doc. IsLine doc => doc -> doc -> doc
    <> Char -> SDoc
    forall doc. IsLine doc => Char -> doc
    char Char
    ' '

                annParen :: AnnParen -> SDoc
                annParen :: AnnParen -> SDoc
    annParen (AnnParen ParenType
    a EpaLocation
    o EpaLocation
    c) = 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
    "AnnParen"
                 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
    "AnnParen"
                            SDoc -> SDoc -> SDoc
    forall doc. IsDoc doc => doc -> doc -> doc
    $$ [SDoc] -> SDoc
    forall doc. IsDoc doc => [doc] -> doc
    vcat [ParenType -> SDoc
    forall a. Outputable a => a -> SDoc
    ppr ParenType
    a, EpaLocation -> SDoc
    epaAnchor EpaLocation
    o, EpaLocation -> SDoc
    epaAnchor EpaLocation
    c]

                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, Typeable 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, Typeable 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, Typeable 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, Typeable 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, Typeable 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, Typeable 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, Typeable 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, Typeable 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, Typeable 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, Typeable a) => SDoc -> EpAnn a -> SDoc
    annotation' (String -> SDoc
    forall doc. IsLine doc => String -> doc
    text String
    "EpAnn EpaLocation")

                annotationNoEpAnns :: EpAnn NoEpAnns -> SDoc
                annotationNoEpAnns :: EpAnn NoEpAnns -> SDoc
    annotationNoEpAnns = SDoc -> EpAnn NoEpAnns -> SDoc
    forall a. (Data a, Typeable a) => SDoc -> EpAnn a -> SDoc
    annotation' (String -> SDoc
    forall doc. IsLine doc => String -> doc
    text String
    "EpAnn NoEpAnns")

                annotation' :: forall a .(Data a, Typeable a)
                           => SDoc -> EpAnn a -> SDoc
                annotation' :: forall a. (Data a, Typeable 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 :: EpAnn AnnListItem -> SDoc
                srcSpanAnnA :: EpAnn AnnListItem -> SDoc
    srcSpanAnnA = SDoc -> EpAnn AnnListItem -> SDoc
    forall a. (Typeable a, Data a) => SDoc -> EpAnn a -> SDoc
    locatedAnn'' (String -> SDoc
    forall doc. IsLine doc => String -> doc
    text String
    "SrcSpanAnnA")

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

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

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

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

                locatedAnn'' :: forall a. (Typeable a, Data a)
                  => SDoc -> EpAnn a -> SDoc
                locatedAnn'' :: forall a. (Typeable a, Data a) => SDoc -> EpAnn a -> SDoc
    locatedAnn'' SDoc
    tag EpAnn a
    ss = SDoc -> SDoc
    forall doc. IsLine doc => doc -> doc
    parens (SDoc -> SDoc) -> SDoc -> SDoc
    forall a b. (a -> b) -> a -> b
    $
                  case EpAnn a -> Maybe (EpAnn a)
    forall a b. (Typeable a, Typeable b) => a -> Maybe b
    cast EpAnn a
    ss of
                    Just (EpAnn a
    ann :: EpAnn 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 (Constr -> String
    showConstr (EpAnn a -> Constr
    forall a. Data a => a -> Constr
    toConstr EpAnn a
    ann))
                                              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
    ann)
                    Maybe (EpAnn 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 (EpAnn a -> Constr
    forall a. Data a => a -> Constr
    toConstr EpAnn 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 []                     = []

    {-
    ************************************************************************
    *                                                                      *
    * Copied from syb
    *                                                                      *
    ************************************************************************
    -}

    -- | The type constructor for queries
    newtype Q q x = Q { forall q x. Q q x -> x -> q
    unQ :: x -> q }

    -- | Extend a generic query by a type-specific case
    extQ :: ( Typeable a
            , Typeable b
            )
         => (a -> q)
         -> (b -> q)
         -> a
         -> q
    extQ :: forall a b q.
    (Typeable a, Typeable b) =>
    (a -> q) -> (b -> q) -> a -> q
    extQ a -> q
    f b -> q
    g a
    a = q -> (b -> q) -> Maybe b -> q
    forall b a. b -> (a -> b) -> Maybe a -> b
    maybe (a -> q
    f a
    a) b -> q
    g (a -> Maybe b
    forall a b. (Typeable a, Typeable b) => a -> Maybe b
    cast a
    a)

    -- | Type extension of queries for type constructors
    ext1Q :: (Data d, Typeable t)
          => (d -> q)
          -> (forall e. Data e => t e -> q)
          -> d -> q
    ext1Q :: forall d (t :: * -> *) q.
    (Data d, Typeable t) =>
    (d -> q) -> (forall e. Data e => t e -> q) -> d -> q
    ext1Q d -> q
    def forall e. Data e => t e -> q
    ext = Q q d -> d -> q
    forall q x. Q q x -> x -> q
    unQ (((d -> q) -> Q q d
    forall q x. (x -> q) -> Q q x
    Q d -> q
    def) Q q d -> (forall d. Data d => Q q (t d)) -> Q q d
    forall a (t :: * -> *) (c :: * -> *).
    (Data a, Typeable t) =>
    c a -> (forall d. Data d => c (t d)) -> c a
    `ext1` ((t d -> q) -> Q q (t d)
    forall q x. (x -> q) -> Q q x
    Q t d -> q
    forall e. Data e => t e -> q
    ext))

    -- | Type extension of queries for type constructors
    ext2Q :: (Data d, Typeable t)
          => (d -> q)
          -> (forall d1 d2. (Data d1, Data d2) => t d1 d2 -> q)
          -> d -> q
    ext2Q :: forall d (t :: * -> * -> *) q.
    (Data d, Typeable t) =>
    (d -> q)
    -> (forall d1 d2. (Data d1, Data d2) => t d1 d2 -> q) -> d -> q
    ext2Q d -> q
    def forall d1 d2. (Data d1, Data d2) => t d1 d2 -> q
    ext = Q q d -> d -> q
    forall q x. Q q x -> x -> q
    unQ (((d -> q) -> Q q d
    forall q x. (x -> q) -> Q q x
    Q d -> q
    def) Q q d
    -> (forall d1 d2. (Data d1, Data d2) => Q q (t d1 d2)) -> Q q d
    forall a (t :: * -> * -> *) (c :: * -> *).
    (Data a, Typeable t) =>
    c a -> (forall d1 d2. (Data d1, Data d2) => c (t d1 d2)) -> c a
    `ext2` ((t d1 d2 -> q) -> Q q (t d1 d2)
    forall q x. (x -> q) -> Q q x
    Q t d1 d2 -> q
    forall d1 d2. (Data d1, Data d2) => t d1 d2 -> q
    ext))

    -- | Flexible type extension
    ext1 :: (Data a, Typeable t)
         => c a
         -> (forall d. Data d => c (t d))
         -> c a
    ext1 :: forall a (t :: * -> *) (c :: * -> *).
    (Data a, Typeable t) =>
    c a -> (forall d. Data d => c (t d)) -> c a
    ext1 c a
    def forall d. Data d => c (t d)
    ext = c a -> (c a -> c a) -> Maybe (c a) -> c a
    forall b a. b -> (a -> b) -> Maybe a -> b
    maybe c a
    def c a -> c a
    forall a. a -> a
    id ((forall d. Data d => c (t d)) -> Maybe (c a)
    forall a (t :: * -> *) (c :: * -> *).
    (Data a, Typeable t) =>
    (forall d. Data d => c (t d)) -> Maybe (c a)
    forall (t :: * -> *) (c :: * -> *).
    Typeable t =>
    (forall d. Data d => c (t d)) -> Maybe (c a)
    dataCast1 c (t d)
    forall d. Data d => c (t d)
    ext)

    -- | Flexible type extension
    ext2 :: (Data a, Typeable t)
         => c a
         -> (forall d1 d2. (Data d1, Data d2) => c (t d1 d2))
         -> c a
    ext2 :: forall a (t :: * -> * -> *) (c :: * -> *).
    (Data a, Typeable t) =>
    c a -> (forall d1 d2. (Data d1, Data d2) => c (t d1 d2)) -> c a
    ext2 c a
    def forall d1 d2. (Data d1, Data d2) => c (t d1 d2)
    ext = c a -> (c a -> c a) -> Maybe (c a) -> c a
    forall b a. b -> (a -> b) -> Maybe a -> b
    maybe c a
    def c a -> c a
    forall a. a -> a
    id ((forall d1 d2. (Data d1, Data d2) => c (t d1 d2)) -> Maybe (c a)
    forall a (t :: * -> * -> *) (c :: * -> *).
    (Data a, Typeable t) =>
    (forall d e. (Data d, Data e) => c (t d e)) -> Maybe (c a)
    forall (t :: * -> * -> *) (c :: * -> *).
    Typeable t =>
    (forall d e. (Data d, Data e) => c (t d e)) -> Maybe (c a)
    dataCast2 c (t d e)
    forall d1 d2. (Data d1, Data d2) => c (t d1 d2)
    ext)