{-# LANGUAGE OverloadedStrings #-}

-- |
--
-- Module      : Aihc.Parser.Shorthand
-- Description : Compact pretty-printing for debugging/inspection
--
-- This module provides a compact, human-readable representation of parsed
-- AST structures via the 'Shorthand' typeclass. Key features:
--
-- * Source spans are omitted to reduce noise
-- * Empty fields (Nothing, [], False, etc.) are omitted
-- * Output is on a single line by default
-- * Uses the prettyprinter library for consistent formatting
--
-- Example:
--
-- >>> shorthand $ parseModule defaultConfig "module Demo where x = 1"
-- ParseOk (Module {name = "Demo", decls = [DeclValue (FunctionBind "x" [Match {rhs = UnguardedRhs (EInt 1)}])]})
module Aihc.Parser.Shorthand
  ( Shorthand (..),
  )
where

import Aihc.Parser.Lex (LexToken (..), LexTokenKind (..))
import Aihc.Parser.Syntax
import Aihc.Parser.Types (ParseResult (..))
import Data.Text (Text)
import Prettyprinter
  ( Doc,
    Pretty (..),
    braces,
    brackets,
    comma,
    dquotes,
    hsep,
    parens,
    punctuate,
    (<+>),
  )

-- $setup
-- >>> :set -XOverloadedStrings
-- >>> import Aihc.Parser

-- | Typeclass for compact, human-readable AST representations.
--
-- The 'shorthand' method produces a 'Doc' that can be rendered to text
-- or shown as a string. This is useful for debugging and golden tests.
--
-- Use 'show' on the result of 'shorthand' to get a 'String':
--
-- @
-- show (shorthand expr) :: String
-- @
class Shorthand a where
  shorthand :: a -> Doc ()

-- ParseResult

instance (Shorthand a) => Shorthand (ParseResult a) where
  shorthand :: ParseResult a -> Doc ()
shorthand (ParseOk a
a) = Doc ()
"ParseOk" Doc () -> Doc () -> Doc ()
forall ann. Doc ann -> Doc ann -> Doc ann
<+> Doc () -> Doc ()
forall ann. Doc ann -> Doc ann
parens (a -> Doc ()
forall a. Shorthand a => a -> Doc ()
shorthand a
a)
  shorthand (ParseErr ParseErrorBundle
_) = Doc ()
"ParseErr"

-- Module

instance Shorthand Module where
  shorthand :: Module -> Doc ()
shorthand Module
modu =
    Doc ()
"Module" Doc () -> Doc () -> Doc ()
forall ann. Doc ann -> Doc ann -> Doc ann
<+> Doc () -> Doc ()
forall ann. Doc ann -> Doc ann
braces ([Doc ()] -> Doc ()
forall ann. [Doc ann] -> Doc ann
hsep (Doc () -> [Doc ()] -> [Doc ()]
forall ann. Doc ann -> [Doc ann] -> [Doc ann]
punctuate Doc ()
forall ann. Doc ann
comma [Doc ()]
forall {ann}. [Doc ann]
fields))
    where
      fields :: [Doc ann]
fields =
        Text -> (Text -> Doc ann) -> Maybe Text -> [Doc ann]
forall a ann. Text -> (a -> Doc ann) -> Maybe a -> [Doc ann]
optionalField Text
"name" Text -> Doc ann
forall ann. Text -> Doc ann
docText (Module -> Maybe Text
moduleName Module
modu)
          [Doc ann] -> [Doc ann] -> [Doc ann]
forall a. Semigroup a => a -> a -> a
<> Text
-> (ExtensionSetting -> Doc ann) -> [ExtensionSetting] -> [Doc ann]
forall a ann. Text -> (a -> Doc ann) -> [a] -> [Doc ann]
listField Text
"languagePragmas" ExtensionSetting -> Doc ann
forall ann. ExtensionSetting -> Doc ann
docExtensionSetting (Module -> [ExtensionSetting]
moduleLanguagePragmas Module
modu)
          [Doc ann] -> [Doc ann] -> [Doc ann]
forall a. Semigroup a => a -> a -> a
<> Text -> (WarningText -> Doc ann) -> Maybe WarningText -> [Doc ann]
forall a ann. Text -> (a -> Doc ann) -> Maybe a -> [Doc ann]
optionalField Text
"warningText" WarningText -> Doc ann
forall ann. WarningText -> Doc ann
docWarningText (Module -> Maybe WarningText
moduleWarningText Module
modu)
          [Doc ann] -> [Doc ann] -> [Doc ann]
forall a. Semigroup a => a -> a -> a
<> Text
-> ([ExportSpec] -> Doc ann) -> Maybe [ExportSpec] -> [Doc ann]
forall a ann. Text -> (a -> Doc ann) -> Maybe a -> [Doc ann]
optionalField Text
"exports" (Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann
brackets (Doc ann -> Doc ann)
-> ([ExportSpec] -> Doc ann) -> [ExportSpec] -> Doc ann
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [Doc ann] -> Doc ann
forall ann. [Doc ann] -> Doc ann
hsep ([Doc ann] -> Doc ann)
-> ([ExportSpec] -> [Doc ann]) -> [ExportSpec] -> Doc ann
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Doc ann -> [Doc ann] -> [Doc ann]
forall ann. Doc ann -> [Doc ann] -> [Doc ann]
punctuate Doc ann
forall ann. Doc ann
comma ([Doc ann] -> [Doc ann])
-> ([ExportSpec] -> [Doc ann]) -> [ExportSpec] -> [Doc ann]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (ExportSpec -> Doc ann) -> [ExportSpec] -> [Doc ann]
forall a b. (a -> b) -> [a] -> [b]
map ExportSpec -> Doc ann
forall ann. ExportSpec -> Doc ann
docExportSpec) (Module -> Maybe [ExportSpec]
moduleExports Module
modu)
          [Doc ann] -> [Doc ann] -> [Doc ann]
forall a. Semigroup a => a -> a -> a
<> Text -> (ImportDecl -> Doc ann) -> [ImportDecl] -> [Doc ann]
forall a ann. Text -> (a -> Doc ann) -> [a] -> [Doc ann]
listField Text
"imports" ImportDecl -> Doc ann
forall ann. ImportDecl -> Doc ann
docImportDecl (Module -> [ImportDecl]
moduleImports Module
modu)
          [Doc ann] -> [Doc ann] -> [Doc ann]
forall a. Semigroup a => a -> a -> a
<> Text -> (Decl -> Doc ann) -> [Decl] -> [Doc ann]
forall a ann. Text -> (a -> Doc ann) -> [a] -> [Doc ann]
listField Text
"decls" Decl -> Doc ann
forall ann. Decl -> Doc ann
docDecl (Module -> [Decl]
moduleDecls Module
modu)

instance Shorthand Expr where
  shorthand :: Expr -> Doc ()
shorthand = Expr -> Doc ()
forall ann. Expr -> Doc ann
docExpr

instance Shorthand Pattern where
  shorthand :: Pattern -> Doc ()
shorthand = Pattern -> Doc ()
forall ann. Pattern -> Doc ann
docPattern

instance Shorthand Type where
  shorthand :: Type -> Doc ()
shorthand = Type -> Doc ()
forall ann. Type -> Doc ann
docType

instance Shorthand LexToken where
  shorthand :: LexToken -> Doc ()
shorthand = LexToken -> Doc ()
forall ann. LexToken -> Doc ann
docToken

instance Shorthand LexTokenKind where
  shorthand :: LexTokenKind -> Doc ()
shorthand = LexTokenKind -> Doc ()
forall ann. LexTokenKind -> Doc ann
docTokenKind

docWarningText :: WarningText -> Doc ann
docWarningText :: forall ann. WarningText -> Doc ann
docWarningText WarningText
wt =
  case WarningText
wt of
    DeprText SourceSpan
_ Text
msg -> Doc ann
"DeprText" Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> Text -> Doc ann
forall ann. Text -> Doc ann
docText Text
msg
    WarnText SourceSpan
_ Text
msg -> Doc ann
"WarnText" Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> Text -> Doc ann
forall ann. Text -> Doc ann
docText Text
msg

docExtensionSetting :: ExtensionSetting -> Doc ann
docExtensionSetting :: forall ann. ExtensionSetting -> Doc ann
docExtensionSetting ExtensionSetting
setting =
  case ExtensionSetting
setting of
    EnableExtension Extension
ext -> Doc ann
"EnableExtension" Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> Text -> Doc ann
forall a ann. Pretty a => a -> Doc ann
forall ann. Text -> Doc ann
pretty (Extension -> Text
extensionName Extension
ext)
    DisableExtension Extension
ext -> Doc ann
"DisableExtension" Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> Text -> Doc ann
forall a ann. Pretty a => a -> Doc ann
forall ann. Text -> Doc ann
pretty (Extension -> Text
extensionName Extension
ext)

docExportSpec :: ExportSpec -> Doc ann
docExportSpec :: forall ann. ExportSpec -> Doc ann
docExportSpec ExportSpec
spec =
  case ExportSpec
spec of
    ExportModule SourceSpan
_ Text
name -> Doc ann
"ExportModule" Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> Text -> Doc ann
forall ann. Text -> Doc ann
docText Text
name
    ExportVar SourceSpan
_ Maybe Text
mNamespace Text
name ->
      Doc ann
"ExportVar" Doc ann -> Doc ann -> Doc ann
forall a. Semigroup a => a -> a -> a
<> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann
braces ([Doc ann] -> Doc ann
forall ann. [Doc ann] -> Doc ann
hsep (Doc ann -> [Doc ann] -> [Doc ann]
forall ann. Doc ann -> [Doc ann] -> [Doc ann]
punctuate Doc ann
forall ann. Doc ann
comma (Text -> (Text -> Doc ann) -> Maybe Text -> [Doc ann]
forall a ann. Text -> (a -> Doc ann) -> Maybe a -> [Doc ann]
optionalField Text
"namespace" Text -> Doc ann
forall ann. Text -> Doc ann
docText Maybe Text
mNamespace [Doc ann] -> [Doc ann] -> [Doc ann]
forall a. Semigroup a => a -> a -> a
<> [Text -> Doc ann -> Doc ann
forall ann. Text -> Doc ann -> Doc ann
field Text
"name" (Text -> Doc ann
forall ann. Text -> Doc ann
docText Text
name)])))
    ExportAbs SourceSpan
_ Maybe Text
mNamespace Text
name ->
      Doc ann
"ExportAbs" Doc ann -> Doc ann -> Doc ann
forall a. Semigroup a => a -> a -> a
<> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann
braces ([Doc ann] -> Doc ann
forall ann. [Doc ann] -> Doc ann
hsep (Doc ann -> [Doc ann] -> [Doc ann]
forall ann. Doc ann -> [Doc ann] -> [Doc ann]
punctuate Doc ann
forall ann. Doc ann
comma (Text -> (Text -> Doc ann) -> Maybe Text -> [Doc ann]
forall a ann. Text -> (a -> Doc ann) -> Maybe a -> [Doc ann]
optionalField Text
"namespace" Text -> Doc ann
forall ann. Text -> Doc ann
docText Maybe Text
mNamespace [Doc ann] -> [Doc ann] -> [Doc ann]
forall a. Semigroup a => a -> a -> a
<> [Text -> Doc ann -> Doc ann
forall ann. Text -> Doc ann -> Doc ann
field Text
"name" (Text -> Doc ann
forall ann. Text -> Doc ann
docText Text
name)])))
    ExportAll SourceSpan
_ Maybe Text
mNamespace Text
name ->
      Doc ann
"ExportAll" Doc ann -> Doc ann -> Doc ann
forall a. Semigroup a => a -> a -> a
<> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann
braces ([Doc ann] -> Doc ann
forall ann. [Doc ann] -> Doc ann
hsep (Doc ann -> [Doc ann] -> [Doc ann]
forall ann. Doc ann -> [Doc ann] -> [Doc ann]
punctuate Doc ann
forall ann. Doc ann
comma (Text -> (Text -> Doc ann) -> Maybe Text -> [Doc ann]
forall a ann. Text -> (a -> Doc ann) -> Maybe a -> [Doc ann]
optionalField Text
"namespace" Text -> Doc ann
forall ann. Text -> Doc ann
docText Maybe Text
mNamespace [Doc ann] -> [Doc ann] -> [Doc ann]
forall a. Semigroup a => a -> a -> a
<> [Text -> Doc ann -> Doc ann
forall ann. Text -> Doc ann -> Doc ann
field Text
"name" (Text -> Doc ann
forall ann. Text -> Doc ann
docText Text
name)])))
    ExportWith SourceSpan
_ Maybe Text
mNamespace Text
name [Text]
members ->
      Doc ann
"ExportWith" Doc ann -> Doc ann -> Doc ann
forall a. Semigroup a => a -> a -> a
<> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann
braces ([Doc ann] -> Doc ann
forall ann. [Doc ann] -> Doc ann
hsep (Doc ann -> [Doc ann] -> [Doc ann]
forall ann. Doc ann -> [Doc ann] -> [Doc ann]
punctuate Doc ann
forall ann. Doc ann
comma (Text -> (Text -> Doc ann) -> Maybe Text -> [Doc ann]
forall a ann. Text -> (a -> Doc ann) -> Maybe a -> [Doc ann]
optionalField Text
"namespace" Text -> Doc ann
forall ann. Text -> Doc ann
docText Maybe Text
mNamespace [Doc ann] -> [Doc ann] -> [Doc ann]
forall a. Semigroup a => a -> a -> a
<> [Text -> Doc ann -> Doc ann
forall ann. Text -> Doc ann -> Doc ann
field Text
"name" (Text -> Doc ann
forall ann. Text -> Doc ann
docText Text
name), Text -> Doc ann -> Doc ann
forall ann. Text -> Doc ann -> Doc ann
field Text
"members" ([Text] -> Doc ann
forall ann. [Text] -> Doc ann
docTextList [Text]
members)])))

docImportDecl :: ImportDecl -> Doc ann
docImportDecl :: forall ann. ImportDecl -> Doc ann
docImportDecl ImportDecl
decl =
  Doc ann
"ImportDecl" Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann
braces ([Doc ann] -> Doc ann
forall ann. [Doc ann] -> Doc ann
hsep (Doc ann -> [Doc ann] -> [Doc ann]
forall ann. Doc ann -> [Doc ann] -> [Doc ann]
punctuate Doc ann
forall ann. Doc ann
comma [Doc ann]
forall {ann}. [Doc ann]
fields))
  where
    fields :: [Doc ann]
fields =
      [Text -> Doc ann -> Doc ann
forall ann. Text -> Doc ann -> Doc ann
field Text
"module" (Text -> Doc ann
forall ann. Text -> Doc ann
docText (ImportDecl -> Text
importDeclModule ImportDecl
decl))]
        [Doc ann] -> [Doc ann] -> [Doc ann]
forall a. Semigroup a => a -> a -> a
<> Text -> Bool -> [Doc ann]
forall ann. Text -> Bool -> [Doc ann]
boolField Text
"qualified" (ImportDecl -> Bool
importDeclQualified ImportDecl
decl)
        [Doc ann] -> [Doc ann] -> [Doc ann]
forall a. Semigroup a => a -> a -> a
<> Text -> Bool -> [Doc ann]
forall ann. Text -> Bool -> [Doc ann]
boolField Text
"qualifiedPost" (ImportDecl -> Bool
importDeclQualifiedPost ImportDecl
decl)
        [Doc ann] -> [Doc ann] -> [Doc ann]
forall a. Semigroup a => a -> a -> a
<> Text -> (ImportLevel -> Doc ann) -> Maybe ImportLevel -> [Doc ann]
forall a ann. Text -> (a -> Doc ann) -> Maybe a -> [Doc ann]
optionalField Text
"level" ImportLevel -> Doc ann
forall ann. ImportLevel -> Doc ann
docImportLevel (ImportDecl -> Maybe ImportLevel
importDeclLevel ImportDecl
decl)
        [Doc ann] -> [Doc ann] -> [Doc ann]
forall a. Semigroup a => a -> a -> a
<> Text -> (Text -> Doc ann) -> Maybe Text -> [Doc ann]
forall a ann. Text -> (a -> Doc ann) -> Maybe a -> [Doc ann]
optionalField Text
"package" Text -> Doc ann
forall ann. Text -> Doc ann
docText (ImportDecl -> Maybe Text
importDeclPackage ImportDecl
decl)
        [Doc ann] -> [Doc ann] -> [Doc ann]
forall a. Semigroup a => a -> a -> a
<> Text -> (Text -> Doc ann) -> Maybe Text -> [Doc ann]
forall a ann. Text -> (a -> Doc ann) -> Maybe a -> [Doc ann]
optionalField Text
"as" Text -> Doc ann
forall ann. Text -> Doc ann
docText (ImportDecl -> Maybe Text
importDeclAs ImportDecl
decl)
        [Doc ann] -> [Doc ann] -> [Doc ann]
forall a. Semigroup a => a -> a -> a
<> Text -> (ImportSpec -> Doc ann) -> Maybe ImportSpec -> [Doc ann]
forall a ann. Text -> (a -> Doc ann) -> Maybe a -> [Doc ann]
optionalField Text
"spec" ImportSpec -> Doc ann
forall ann. ImportSpec -> Doc ann
docImportSpec (ImportDecl -> Maybe ImportSpec
importDeclSpec ImportDecl
decl)

docImportLevel :: ImportLevel -> Doc ann
docImportLevel :: forall ann. ImportLevel -> Doc ann
docImportLevel ImportLevel
level =
  case ImportLevel
level of
    ImportLevel
ImportLevelQuote -> Doc ann
"ImportLevelQuote"
    ImportLevel
ImportLevelSplice -> Doc ann
"ImportLevelSplice"

docImportSpec :: ImportSpec -> Doc ann
docImportSpec :: forall ann. ImportSpec -> Doc ann
docImportSpec ImportSpec
spec =
  Doc ann
"ImportSpec" Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann
braces ([Doc ann] -> Doc ann
forall ann. [Doc ann] -> Doc ann
hsep (Doc ann -> [Doc ann] -> [Doc ann]
forall ann. Doc ann -> [Doc ann] -> [Doc ann]
punctuate Doc ann
forall ann. Doc ann
comma [Doc ann]
forall {ann}. [Doc ann]
fields))
  where
    fields :: [Doc ann]
fields =
      Text -> Bool -> [Doc ann]
forall ann. Text -> Bool -> [Doc ann]
boolField Text
"hiding" (ImportSpec -> Bool
importSpecHiding ImportSpec
spec)
        [Doc ann] -> [Doc ann] -> [Doc ann]
forall a. Semigroup a => a -> a -> a
<> [Text -> Doc ann -> Doc ann
forall ann. Text -> Doc ann -> Doc ann
field Text
"items" (Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann
brackets ([Doc ann] -> Doc ann
forall ann. [Doc ann] -> Doc ann
hsep (Doc ann -> [Doc ann] -> [Doc ann]
forall ann. Doc ann -> [Doc ann] -> [Doc ann]
punctuate Doc ann
forall ann. Doc ann
comma ((ImportItem -> Doc ann) -> [ImportItem] -> [Doc ann]
forall a b. (a -> b) -> [a] -> [b]
map ImportItem -> Doc ann
forall ann. ImportItem -> Doc ann
docImportItem (ImportSpec -> [ImportItem]
importSpecItems ImportSpec
spec)))))]

docImportItem :: ImportItem -> Doc ann
docImportItem :: forall ann. ImportItem -> Doc ann
docImportItem ImportItem
item =
  case ImportItem
item of
    ImportItemVar SourceSpan
_ Maybe Text
mNamespace Text
name ->
      Doc ann
"ImportItemVar" Doc ann -> Doc ann -> Doc ann
forall a. Semigroup a => a -> a -> a
<> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann
braces ([Doc ann] -> Doc ann
forall ann. [Doc ann] -> Doc ann
hsep (Doc ann -> [Doc ann] -> [Doc ann]
forall ann. Doc ann -> [Doc ann] -> [Doc ann]
punctuate Doc ann
forall ann. Doc ann
comma (Text -> (Text -> Doc ann) -> Maybe Text -> [Doc ann]
forall a ann. Text -> (a -> Doc ann) -> Maybe a -> [Doc ann]
optionalField Text
"namespace" Text -> Doc ann
forall ann. Text -> Doc ann
docText Maybe Text
mNamespace [Doc ann] -> [Doc ann] -> [Doc ann]
forall a. Semigroup a => a -> a -> a
<> [Text -> Doc ann -> Doc ann
forall ann. Text -> Doc ann -> Doc ann
field Text
"name" (Text -> Doc ann
forall ann. Text -> Doc ann
docText Text
name)])))
    ImportItemAbs SourceSpan
_ Maybe Text
mNamespace Text
name ->
      Doc ann
"ImportItemAbs" Doc ann -> Doc ann -> Doc ann
forall a. Semigroup a => a -> a -> a
<> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann
braces ([Doc ann] -> Doc ann
forall ann. [Doc ann] -> Doc ann
hsep (Doc ann -> [Doc ann] -> [Doc ann]
forall ann. Doc ann -> [Doc ann] -> [Doc ann]
punctuate Doc ann
forall ann. Doc ann
comma (Text -> (Text -> Doc ann) -> Maybe Text -> [Doc ann]
forall a ann. Text -> (a -> Doc ann) -> Maybe a -> [Doc ann]
optionalField Text
"namespace" Text -> Doc ann
forall ann. Text -> Doc ann
docText Maybe Text
mNamespace [Doc ann] -> [Doc ann] -> [Doc ann]
forall a. Semigroup a => a -> a -> a
<> [Text -> Doc ann -> Doc ann
forall ann. Text -> Doc ann -> Doc ann
field Text
"name" (Text -> Doc ann
forall ann. Text -> Doc ann
docText Text
name)])))
    ImportItemAll SourceSpan
_ Maybe Text
mNamespace Text
name ->
      Doc ann
"ImportItemAll" Doc ann -> Doc ann -> Doc ann
forall a. Semigroup a => a -> a -> a
<> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann
braces ([Doc ann] -> Doc ann
forall ann. [Doc ann] -> Doc ann
hsep (Doc ann -> [Doc ann] -> [Doc ann]
forall ann. Doc ann -> [Doc ann] -> [Doc ann]
punctuate Doc ann
forall ann. Doc ann
comma (Text -> (Text -> Doc ann) -> Maybe Text -> [Doc ann]
forall a ann. Text -> (a -> Doc ann) -> Maybe a -> [Doc ann]
optionalField Text
"namespace" Text -> Doc ann
forall ann. Text -> Doc ann
docText Maybe Text
mNamespace [Doc ann] -> [Doc ann] -> [Doc ann]
forall a. Semigroup a => a -> a -> a
<> [Text -> Doc ann -> Doc ann
forall ann. Text -> Doc ann -> Doc ann
field Text
"name" (Text -> Doc ann
forall ann. Text -> Doc ann
docText Text
name)])))
    ImportItemWith SourceSpan
_ Maybe Text
mNamespace Text
name [Text]
members ->
      Doc ann
"ImportItemWith" Doc ann -> Doc ann -> Doc ann
forall a. Semigroup a => a -> a -> a
<> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann
braces ([Doc ann] -> Doc ann
forall ann. [Doc ann] -> Doc ann
hsep (Doc ann -> [Doc ann] -> [Doc ann]
forall ann. Doc ann -> [Doc ann] -> [Doc ann]
punctuate Doc ann
forall ann. Doc ann
comma (Text -> (Text -> Doc ann) -> Maybe Text -> [Doc ann]
forall a ann. Text -> (a -> Doc ann) -> Maybe a -> [Doc ann]
optionalField Text
"namespace" Text -> Doc ann
forall ann. Text -> Doc ann
docText Maybe Text
mNamespace [Doc ann] -> [Doc ann] -> [Doc ann]
forall a. Semigroup a => a -> a -> a
<> [Text -> Doc ann -> Doc ann
forall ann. Text -> Doc ann -> Doc ann
field Text
"name" (Text -> Doc ann
forall ann. Text -> Doc ann
docText Text
name), Text -> Doc ann -> Doc ann
forall ann. Text -> Doc ann -> Doc ann
field Text
"members" ([Text] -> Doc ann
forall ann. [Text] -> Doc ann
docTextList [Text]
members)])))

-- Declarations

docDecl :: Decl -> Doc ann
docDecl :: forall ann. Decl -> Doc ann
docDecl Decl
decl =
  case Decl
decl of
    DeclValue SourceSpan
_ ValueDecl
vdecl -> Doc ann
"DeclValue" Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann
parens (ValueDecl -> Doc ann
forall ann. ValueDecl -> Doc ann
docValueDecl ValueDecl
vdecl)
    DeclTypeSig SourceSpan
_ [Text]
names Type
ty -> Doc ann
"DeclTypeSig" Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann
braces ([Doc ann] -> Doc ann
forall ann. [Doc ann] -> Doc ann
hsep (Doc ann -> [Doc ann] -> [Doc ann]
forall ann. Doc ann -> [Doc ann] -> [Doc ann]
punctuate Doc ann
forall ann. Doc ann
comma [Text -> Doc ann -> Doc ann
forall ann. Text -> Doc ann -> Doc ann
field Text
"names" ([Text] -> Doc ann
forall ann. [Text] -> Doc ann
docTextList [Text]
names), Text -> Doc ann -> Doc ann
forall ann. Text -> Doc ann -> Doc ann
field Text
"type" (Type -> Doc ann
forall ann. Type -> Doc ann
docType Type
ty)]))
    DeclStandaloneKindSig SourceSpan
_ Text
name Type
kind -> Doc ann
"DeclStandaloneKindSig" Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann
braces ([Doc ann] -> Doc ann
forall ann. [Doc ann] -> Doc ann
hsep (Doc ann -> [Doc ann] -> [Doc ann]
forall ann. Doc ann -> [Doc ann] -> [Doc ann]
punctuate Doc ann
forall ann. Doc ann
comma [Text -> Doc ann -> Doc ann
forall ann. Text -> Doc ann -> Doc ann
field Text
"name" (Text -> Doc ann
forall ann. Text -> Doc ann
docText Text
name), Text -> Doc ann -> Doc ann
forall ann. Text -> Doc ann -> Doc ann
field Text
"kind" (Type -> Doc ann
forall ann. Type -> Doc ann
docType Type
kind)]))
    DeclFixity SourceSpan
_ FixityAssoc
assoc Maybe Int
mPrec [Text]
ops -> Doc ann
"DeclFixity" Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann
braces ([Doc ann] -> Doc ann
forall ann. [Doc ann] -> Doc ann
hsep (Doc ann -> [Doc ann] -> [Doc ann]
forall ann. Doc ann -> [Doc ann] -> [Doc ann]
punctuate Doc ann
forall ann. Doc ann
comma ([Text -> Doc ann -> Doc ann
forall ann. Text -> Doc ann -> Doc ann
field Text
"assoc" (FixityAssoc -> Doc ann
forall ann. FixityAssoc -> Doc ann
docFixityAssoc FixityAssoc
assoc)] [Doc ann] -> [Doc ann] -> [Doc ann]
forall a. Semigroup a => a -> a -> a
<> Text -> (Int -> Doc ann) -> Maybe Int -> [Doc ann]
forall a ann. Text -> (a -> Doc ann) -> Maybe a -> [Doc ann]
optionalField Text
"prec" Int -> Doc ann
forall ann. Int -> Doc ann
forall a ann. Pretty a => a -> Doc ann
pretty Maybe Int
mPrec [Doc ann] -> [Doc ann] -> [Doc ann]
forall a. Semigroup a => a -> a -> a
<> [Text -> Doc ann -> Doc ann
forall ann. Text -> Doc ann -> Doc ann
field Text
"ops" ([Text] -> Doc ann
forall ann. [Text] -> Doc ann
docTextList [Text]
ops)])))
    DeclTypeSyn SourceSpan
_ TypeSynDecl
syn -> Doc ann
"DeclTypeSyn" Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann
parens (TypeSynDecl -> Doc ann
forall ann. TypeSynDecl -> Doc ann
docTypeSynDecl TypeSynDecl
syn)
    DeclData SourceSpan
_ DataDecl
dd -> Doc ann
"DeclData" Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann
parens (DataDecl -> Doc ann
forall ann. DataDecl -> Doc ann
docDataDecl DataDecl
dd)
    DeclNewtype SourceSpan
_ NewtypeDecl
nd -> Doc ann
"DeclNewtype" Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann
parens (NewtypeDecl -> Doc ann
forall ann. NewtypeDecl -> Doc ann
docNewtypeDecl NewtypeDecl
nd)
    DeclClass SourceSpan
_ ClassDecl
cd -> Doc ann
"DeclClass" Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann
parens (ClassDecl -> Doc ann
forall ann. ClassDecl -> Doc ann
docClassDecl ClassDecl
cd)
    DeclInstance SourceSpan
_ InstanceDecl
inst -> Doc ann
"DeclInstance" Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann
parens (InstanceDecl -> Doc ann
forall ann. InstanceDecl -> Doc ann
docInstanceDecl InstanceDecl
inst)
    DeclStandaloneDeriving SourceSpan
_ StandaloneDerivingDecl
sd -> Doc ann
"DeclStandaloneDeriving" Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann
parens (StandaloneDerivingDecl -> Doc ann
forall ann. StandaloneDerivingDecl -> Doc ann
docStandaloneDerivingDecl StandaloneDerivingDecl
sd)
    DeclDefault SourceSpan
_ [Type]
tys -> Doc ann
"DeclDefault" Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann
brackets ([Doc ann] -> Doc ann
forall ann. [Doc ann] -> Doc ann
hsep (Doc ann -> [Doc ann] -> [Doc ann]
forall ann. Doc ann -> [Doc ann] -> [Doc ann]
punctuate Doc ann
forall ann. Doc ann
comma ((Type -> Doc ann) -> [Type] -> [Doc ann]
forall a b. (a -> b) -> [a] -> [b]
map Type -> Doc ann
forall ann. Type -> Doc ann
docType [Type]
tys)))
    DeclForeign SourceSpan
_ ForeignDecl
fd -> Doc ann
"DeclForeign" Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann
parens (ForeignDecl -> Doc ann
forall ann. ForeignDecl -> Doc ann
docForeignDecl ForeignDecl
fd)

docValueDecl :: ValueDecl -> Doc ann
docValueDecl :: forall ann. ValueDecl -> Doc ann
docValueDecl ValueDecl
vdecl =
  case ValueDecl
vdecl of
    FunctionBind SourceSpan
_ Text
name [Match]
matches -> Doc ann
"FunctionBind" Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> Text -> Doc ann
forall ann. Text -> Doc ann
docText Text
name Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann
brackets ([Doc ann] -> Doc ann
forall ann. [Doc ann] -> Doc ann
hsep (Doc ann -> [Doc ann] -> [Doc ann]
forall ann. Doc ann -> [Doc ann] -> [Doc ann]
punctuate Doc ann
forall ann. Doc ann
comma ((Match -> Doc ann) -> [Match] -> [Doc ann]
forall a b. (a -> b) -> [a] -> [b]
map Match -> Doc ann
forall ann. Match -> Doc ann
docMatch [Match]
matches)))
    PatternBind SourceSpan
_ Pattern
pat Rhs
rhs -> Doc ann
"PatternBind" Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> Pattern -> Doc ann
forall ann. Pattern -> Doc ann
docPattern Pattern
pat Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> Rhs -> Doc ann
forall ann. Rhs -> Doc ann
docRhs Rhs
rhs

docMatch :: Match -> Doc ann
docMatch :: forall ann. Match -> Doc ann
docMatch Match
m =
  Doc ann
"Match" Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann
braces ([Doc ann] -> Doc ann
forall ann. [Doc ann] -> Doc ann
hsep (Doc ann -> [Doc ann] -> [Doc ann]
forall ann. Doc ann -> [Doc ann] -> [Doc ann]
punctuate Doc ann
forall ann. Doc ann
comma [Doc ann]
forall {ann}. [Doc ann]
fields))
  where
    fields :: [Doc ann]
fields =
      Text -> (Pattern -> Doc ann) -> [Pattern] -> [Doc ann]
forall a ann. Text -> (a -> Doc ann) -> [a] -> [Doc ann]
listField Text
"pats" Pattern -> Doc ann
forall ann. Pattern -> Doc ann
docPattern (Match -> [Pattern]
matchPats Match
m)
        [Doc ann] -> [Doc ann] -> [Doc ann]
forall a. Semigroup a => a -> a -> a
<> [Text -> Doc ann -> Doc ann
forall ann. Text -> Doc ann -> Doc ann
field Text
"rhs" (Rhs -> Doc ann
forall ann. Rhs -> Doc ann
docRhs (Match -> Rhs
matchRhs Match
m))]

docRhs :: Rhs -> Doc ann
docRhs :: forall ann. Rhs -> Doc ann
docRhs Rhs
rhs =
  case Rhs
rhs of
    UnguardedRhs SourceSpan
_ Expr
expr -> Doc ann
"UnguardedRhs" Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann
parens (Expr -> Doc ann
forall ann. Expr -> Doc ann
docExpr Expr
expr)
    GuardedRhss SourceSpan
_ [GuardedRhs]
grhss -> Doc ann
"GuardedRhss" Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann
brackets ([Doc ann] -> Doc ann
forall ann. [Doc ann] -> Doc ann
hsep (Doc ann -> [Doc ann] -> [Doc ann]
forall ann. Doc ann -> [Doc ann] -> [Doc ann]
punctuate Doc ann
forall ann. Doc ann
comma ((GuardedRhs -> Doc ann) -> [GuardedRhs] -> [Doc ann]
forall a b. (a -> b) -> [a] -> [b]
map GuardedRhs -> Doc ann
forall ann. GuardedRhs -> Doc ann
docGuardedRhs [GuardedRhs]
grhss)))

docGuardedRhs :: GuardedRhs -> Doc ann
docGuardedRhs :: forall ann. GuardedRhs -> Doc ann
docGuardedRhs GuardedRhs
grhs =
  Doc ann
"GuardedRhs" Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann
braces ([Doc ann] -> Doc ann
forall ann. [Doc ann] -> Doc ann
hsep (Doc ann -> [Doc ann] -> [Doc ann]
forall ann. Doc ann -> [Doc ann] -> [Doc ann]
punctuate Doc ann
forall ann. Doc ann
comma [Text -> Doc ann -> Doc ann
forall ann. Text -> Doc ann -> Doc ann
field Text
"guards" (Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann
brackets ([Doc ann] -> Doc ann
forall ann. [Doc ann] -> Doc ann
hsep (Doc ann -> [Doc ann] -> [Doc ann]
forall ann. Doc ann -> [Doc ann] -> [Doc ann]
punctuate Doc ann
forall ann. Doc ann
comma ((GuardQualifier -> Doc ann) -> [GuardQualifier] -> [Doc ann]
forall a b. (a -> b) -> [a] -> [b]
map GuardQualifier -> Doc ann
forall ann. GuardQualifier -> Doc ann
docGuardQualifier (GuardedRhs -> [GuardQualifier]
guardedRhsGuards GuardedRhs
grhs))))), Text -> Doc ann -> Doc ann
forall ann. Text -> Doc ann -> Doc ann
field Text
"body" (Expr -> Doc ann
forall ann. Expr -> Doc ann
docExpr (GuardedRhs -> Expr
guardedRhsBody GuardedRhs
grhs))]))

docGuardQualifier :: GuardQualifier -> Doc ann
docGuardQualifier :: forall ann. GuardQualifier -> Doc ann
docGuardQualifier GuardQualifier
gq =
  case GuardQualifier
gq of
    GuardExpr SourceSpan
_ Expr
expr -> Doc ann
"GuardExpr" Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann
parens (Expr -> Doc ann
forall ann. Expr -> Doc ann
docExpr Expr
expr)
    GuardPat SourceSpan
_ Pattern
pat Expr
expr -> Doc ann
"GuardPat" Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann
parens (Pattern -> Doc ann
forall ann. Pattern -> Doc ann
docPattern Pattern
pat) Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann
parens (Expr -> Doc ann
forall ann. Expr -> Doc ann
docExpr Expr
expr)
    GuardLet SourceSpan
_ [Decl]
decls -> Doc ann
"GuardLet" Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann
brackets ([Doc ann] -> Doc ann
forall ann. [Doc ann] -> Doc ann
hsep (Doc ann -> [Doc ann] -> [Doc ann]
forall ann. Doc ann -> [Doc ann] -> [Doc ann]
punctuate Doc ann
forall ann. Doc ann
comma ((Decl -> Doc ann) -> [Decl] -> [Doc ann]
forall a b. (a -> b) -> [a] -> [b]
map Decl -> Doc ann
forall ann. Decl -> Doc ann
docDecl [Decl]
decls)))

docTypeSynDecl :: TypeSynDecl -> Doc ann
docTypeSynDecl :: forall ann. TypeSynDecl -> Doc ann
docTypeSynDecl TypeSynDecl
syn =
  Doc ann
"TypeSynDecl" Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann
braces ([Doc ann] -> Doc ann
forall ann. [Doc ann] -> Doc ann
hsep (Doc ann -> [Doc ann] -> [Doc ann]
forall ann. Doc ann -> [Doc ann] -> [Doc ann]
punctuate Doc ann
forall ann. Doc ann
comma [Doc ann]
forall {ann}. [Doc ann]
fields))
  where
    fields :: [Doc ann]
fields =
      [Text -> Doc ann -> Doc ann
forall ann. Text -> Doc ann -> Doc ann
field Text
"name" (Text -> Doc ann
forall ann. Text -> Doc ann
docText (TypeSynDecl -> Text
typeSynName TypeSynDecl
syn))]
        [Doc ann] -> [Doc ann] -> [Doc ann]
forall a. Semigroup a => a -> a -> a
<> Text -> (TyVarBinder -> Doc ann) -> [TyVarBinder] -> [Doc ann]
forall a ann. Text -> (a -> Doc ann) -> [a] -> [Doc ann]
listField Text
"params" TyVarBinder -> Doc ann
forall ann. TyVarBinder -> Doc ann
docTyVarBinder (TypeSynDecl -> [TyVarBinder]
typeSynParams TypeSynDecl
syn)
        [Doc ann] -> [Doc ann] -> [Doc ann]
forall a. Semigroup a => a -> a -> a
<> [Text -> Doc ann -> Doc ann
forall ann. Text -> Doc ann -> Doc ann
field Text
"body" (Type -> Doc ann
forall ann. Type -> Doc ann
docType (TypeSynDecl -> Type
typeSynBody TypeSynDecl
syn))]

docDataDecl :: DataDecl -> Doc ann
docDataDecl :: forall ann. DataDecl -> Doc ann
docDataDecl DataDecl
dd =
  Doc ann
"DataDecl" Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann
braces ([Doc ann] -> Doc ann
forall ann. [Doc ann] -> Doc ann
hsep (Doc ann -> [Doc ann] -> [Doc ann]
forall ann. Doc ann -> [Doc ann] -> [Doc ann]
punctuate Doc ann
forall ann. Doc ann
comma [Doc ann]
forall {ann}. [Doc ann]
fields))
  where
    fields :: [Doc ann]
fields =
      [Text -> Doc ann -> Doc ann
forall ann. Text -> Doc ann -> Doc ann
field Text
"name" (Text -> Doc ann
forall ann. Text -> Doc ann
docText (DataDecl -> Text
dataDeclName DataDecl
dd))]
        [Doc ann] -> [Doc ann] -> [Doc ann]
forall a. Semigroup a => a -> a -> a
<> Text -> (Constraint -> Doc ann) -> [Constraint] -> [Doc ann]
forall a ann. Text -> (a -> Doc ann) -> [a] -> [Doc ann]
listField Text
"context" Constraint -> Doc ann
forall ann. Constraint -> Doc ann
docConstraint (DataDecl -> [Constraint]
dataDeclContext DataDecl
dd)
        [Doc ann] -> [Doc ann] -> [Doc ann]
forall a. Semigroup a => a -> a -> a
<> Text -> (TyVarBinder -> Doc ann) -> [TyVarBinder] -> [Doc ann]
forall a ann. Text -> (a -> Doc ann) -> [a] -> [Doc ann]
listField Text
"params" TyVarBinder -> Doc ann
forall ann. TyVarBinder -> Doc ann
docTyVarBinder (DataDecl -> [TyVarBinder]
dataDeclParams DataDecl
dd)
        [Doc ann] -> [Doc ann] -> [Doc ann]
forall a. Semigroup a => a -> a -> a
<> Text -> (DataConDecl -> Doc ann) -> [DataConDecl] -> [Doc ann]
forall a ann. Text -> (a -> Doc ann) -> [a] -> [Doc ann]
listField Text
"constructors" DataConDecl -> Doc ann
forall ann. DataConDecl -> Doc ann
docDataConDecl (DataDecl -> [DataConDecl]
dataDeclConstructors DataDecl
dd)
        [Doc ann] -> [Doc ann] -> [Doc ann]
forall a. Semigroup a => a -> a -> a
<> Text
-> (DerivingClause -> Doc ann) -> [DerivingClause] -> [Doc ann]
forall a ann. Text -> (a -> Doc ann) -> [a] -> [Doc ann]
listField Text
"deriving" DerivingClause -> Doc ann
forall ann. DerivingClause -> Doc ann
docDerivingClause (DataDecl -> [DerivingClause]
dataDeclDeriving DataDecl
dd)

docNewtypeDecl :: NewtypeDecl -> Doc ann
docNewtypeDecl :: forall ann. NewtypeDecl -> Doc ann
docNewtypeDecl NewtypeDecl
nd =
  Doc ann
"NewtypeDecl" Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann
braces ([Doc ann] -> Doc ann
forall ann. [Doc ann] -> Doc ann
hsep (Doc ann -> [Doc ann] -> [Doc ann]
forall ann. Doc ann -> [Doc ann] -> [Doc ann]
punctuate Doc ann
forall ann. Doc ann
comma [Doc ann]
forall {ann}. [Doc ann]
fields))
  where
    fields :: [Doc ann]
fields =
      [Text -> Doc ann -> Doc ann
forall ann. Text -> Doc ann -> Doc ann
field Text
"name" (Text -> Doc ann
forall ann. Text -> Doc ann
docText (NewtypeDecl -> Text
newtypeDeclName NewtypeDecl
nd))]
        [Doc ann] -> [Doc ann] -> [Doc ann]
forall a. Semigroup a => a -> a -> a
<> Text -> (Constraint -> Doc ann) -> [Constraint] -> [Doc ann]
forall a ann. Text -> (a -> Doc ann) -> [a] -> [Doc ann]
listField Text
"context" Constraint -> Doc ann
forall ann. Constraint -> Doc ann
docConstraint (NewtypeDecl -> [Constraint]
newtypeDeclContext NewtypeDecl
nd)
        [Doc ann] -> [Doc ann] -> [Doc ann]
forall a. Semigroup a => a -> a -> a
<> Text -> (TyVarBinder -> Doc ann) -> [TyVarBinder] -> [Doc ann]
forall a ann. Text -> (a -> Doc ann) -> [a] -> [Doc ann]
listField Text
"params" TyVarBinder -> Doc ann
forall ann. TyVarBinder -> Doc ann
docTyVarBinder (NewtypeDecl -> [TyVarBinder]
newtypeDeclParams NewtypeDecl
nd)
        [Doc ann] -> [Doc ann] -> [Doc ann]
forall a. Semigroup a => a -> a -> a
<> Text -> (DataConDecl -> Doc ann) -> Maybe DataConDecl -> [Doc ann]
forall a ann. Text -> (a -> Doc ann) -> Maybe a -> [Doc ann]
optionalField Text
"constructor" DataConDecl -> Doc ann
forall ann. DataConDecl -> Doc ann
docDataConDecl (NewtypeDecl -> Maybe DataConDecl
newtypeDeclConstructor NewtypeDecl
nd)
        [Doc ann] -> [Doc ann] -> [Doc ann]
forall a. Semigroup a => a -> a -> a
<> Text
-> (DerivingClause -> Doc ann) -> [DerivingClause] -> [Doc ann]
forall a ann. Text -> (a -> Doc ann) -> [a] -> [Doc ann]
listField Text
"deriving" DerivingClause -> Doc ann
forall ann. DerivingClause -> Doc ann
docDerivingClause (NewtypeDecl -> [DerivingClause]
newtypeDeclDeriving NewtypeDecl
nd)

docDataConDecl :: DataConDecl -> Doc ann
docDataConDecl :: forall ann. DataConDecl -> Doc ann
docDataConDecl DataConDecl
dcd =
  case DataConDecl
dcd of
    PrefixCon SourceSpan
_ [Text]
forallVars [Constraint]
constraints Text
name [BangType]
fields' ->
      Doc ann
"PrefixCon" Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann
braces ([Doc ann] -> Doc ann
forall ann. [Doc ann] -> Doc ann
hsep (Doc ann -> [Doc ann] -> [Doc ann]
forall ann. Doc ann -> [Doc ann] -> [Doc ann]
punctuate Doc ann
forall ann. Doc ann
comma ([Text -> Doc ann -> Doc ann
forall ann. Text -> Doc ann -> Doc ann
field Text
"name" (Text -> Doc ann
forall ann. Text -> Doc ann
docText Text
name)] [Doc ann] -> [Doc ann] -> [Doc ann]
forall a. Semigroup a => a -> a -> a
<> Text -> (Text -> Doc ann) -> [Text] -> [Doc ann]
forall a ann. Text -> (a -> Doc ann) -> [a] -> [Doc ann]
listField Text
"forallVars" Text -> Doc ann
forall ann. Text -> Doc ann
docText [Text]
forallVars [Doc ann] -> [Doc ann] -> [Doc ann]
forall a. Semigroup a => a -> a -> a
<> Text -> (Constraint -> Doc ann) -> [Constraint] -> [Doc ann]
forall a ann. Text -> (a -> Doc ann) -> [a] -> [Doc ann]
listField Text
"constraints" Constraint -> Doc ann
forall ann. Constraint -> Doc ann
docConstraint [Constraint]
constraints [Doc ann] -> [Doc ann] -> [Doc ann]
forall a. Semigroup a => a -> a -> a
<> Text -> (BangType -> Doc ann) -> [BangType] -> [Doc ann]
forall a ann. Text -> (a -> Doc ann) -> [a] -> [Doc ann]
listField Text
"fields" BangType -> Doc ann
forall ann. BangType -> Doc ann
docBangType [BangType]
fields')))
    InfixCon SourceSpan
_ [Text]
forallVars [Constraint]
constraints BangType
lhs Text
op BangType
rhs ->
      Doc ann
"InfixCon" Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann
braces ([Doc ann] -> Doc ann
forall ann. [Doc ann] -> Doc ann
hsep (Doc ann -> [Doc ann] -> [Doc ann]
forall ann. Doc ann -> [Doc ann] -> [Doc ann]
punctuate Doc ann
forall ann. Doc ann
comma ([Text -> Doc ann -> Doc ann
forall ann. Text -> Doc ann -> Doc ann
field Text
"op" (Text -> Doc ann
forall ann. Text -> Doc ann
docText Text
op), Text -> Doc ann -> Doc ann
forall ann. Text -> Doc ann -> Doc ann
field Text
"lhs" (BangType -> Doc ann
forall ann. BangType -> Doc ann
docBangType BangType
lhs), Text -> Doc ann -> Doc ann
forall ann. Text -> Doc ann -> Doc ann
field Text
"rhs" (BangType -> Doc ann
forall ann. BangType -> Doc ann
docBangType BangType
rhs)] [Doc ann] -> [Doc ann] -> [Doc ann]
forall a. Semigroup a => a -> a -> a
<> Text -> (Text -> Doc ann) -> [Text] -> [Doc ann]
forall a ann. Text -> (a -> Doc ann) -> [a] -> [Doc ann]
listField Text
"forallVars" Text -> Doc ann
forall ann. Text -> Doc ann
docText [Text]
forallVars [Doc ann] -> [Doc ann] -> [Doc ann]
forall a. Semigroup a => a -> a -> a
<> Text -> (Constraint -> Doc ann) -> [Constraint] -> [Doc ann]
forall a ann. Text -> (a -> Doc ann) -> [a] -> [Doc ann]
listField Text
"constraints" Constraint -> Doc ann
forall ann. Constraint -> Doc ann
docConstraint [Constraint]
constraints)))
    RecordCon SourceSpan
_ [Text]
forallVars [Constraint]
constraints Text
name [FieldDecl]
fields' ->
      Doc ann
"RecordCon" Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann
braces ([Doc ann] -> Doc ann
forall ann. [Doc ann] -> Doc ann
hsep (Doc ann -> [Doc ann] -> [Doc ann]
forall ann. Doc ann -> [Doc ann] -> [Doc ann]
punctuate Doc ann
forall ann. Doc ann
comma ([Text -> Doc ann -> Doc ann
forall ann. Text -> Doc ann -> Doc ann
field Text
"name" (Text -> Doc ann
forall ann. Text -> Doc ann
docText Text
name)] [Doc ann] -> [Doc ann] -> [Doc ann]
forall a. Semigroup a => a -> a -> a
<> Text -> (Text -> Doc ann) -> [Text] -> [Doc ann]
forall a ann. Text -> (a -> Doc ann) -> [a] -> [Doc ann]
listField Text
"forallVars" Text -> Doc ann
forall ann. Text -> Doc ann
docText [Text]
forallVars [Doc ann] -> [Doc ann] -> [Doc ann]
forall a. Semigroup a => a -> a -> a
<> Text -> (Constraint -> Doc ann) -> [Constraint] -> [Doc ann]
forall a ann. Text -> (a -> Doc ann) -> [a] -> [Doc ann]
listField Text
"constraints" Constraint -> Doc ann
forall ann. Constraint -> Doc ann
docConstraint [Constraint]
constraints [Doc ann] -> [Doc ann] -> [Doc ann]
forall a. Semigroup a => a -> a -> a
<> Text -> (FieldDecl -> Doc ann) -> [FieldDecl] -> [Doc ann]
forall a ann. Text -> (a -> Doc ann) -> [a] -> [Doc ann]
listField Text
"fields" FieldDecl -> Doc ann
forall ann. FieldDecl -> Doc ann
docFieldDecl [FieldDecl]
fields')))
    GadtCon SourceSpan
_ [TyVarBinder]
forallBinders [Constraint]
constraints [Text]
names GadtBody
body ->
      Doc ann
"GadtCon" Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann
braces ([Doc ann] -> Doc ann
forall ann. [Doc ann] -> Doc ann
hsep (Doc ann -> [Doc ann] -> [Doc ann]
forall ann. Doc ann -> [Doc ann] -> [Doc ann]
punctuate Doc ann
forall ann. Doc ann
comma (Text -> (Text -> Doc ann) -> [Text] -> [Doc ann]
forall a ann. Text -> (a -> Doc ann) -> [a] -> [Doc ann]
listField Text
"names" Text -> Doc ann
forall ann. Text -> Doc ann
docText [Text]
names [Doc ann] -> [Doc ann] -> [Doc ann]
forall a. Semigroup a => a -> a -> a
<> Text -> (TyVarBinder -> Doc ann) -> [TyVarBinder] -> [Doc ann]
forall a ann. Text -> (a -> Doc ann) -> [a] -> [Doc ann]
listField Text
"forallBinders" TyVarBinder -> Doc ann
forall ann. TyVarBinder -> Doc ann
docTyVarBinder [TyVarBinder]
forallBinders [Doc ann] -> [Doc ann] -> [Doc ann]
forall a. Semigroup a => a -> a -> a
<> Text -> (Constraint -> Doc ann) -> [Constraint] -> [Doc ann]
forall a ann. Text -> (a -> Doc ann) -> [a] -> [Doc ann]
listField Text
"constraints" Constraint -> Doc ann
forall ann. Constraint -> Doc ann
docConstraint [Constraint]
constraints [Doc ann] -> [Doc ann] -> [Doc ann]
forall a. Semigroup a => a -> a -> a
<> [Text -> Doc ann -> Doc ann
forall ann. Text -> Doc ann -> Doc ann
field Text
"body" (GadtBody -> Doc ann
forall ann. GadtBody -> Doc ann
docGadtBody GadtBody
body)])))

-- | Document a GADT body
docGadtBody :: GadtBody -> Doc ann
docGadtBody :: forall ann. GadtBody -> Doc ann
docGadtBody GadtBody
body =
  case GadtBody
body of
    GadtPrefixBody [BangType]
args Type
resultTy ->
      Doc ann
"GadtPrefixBody" Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann
braces ([Doc ann] -> Doc ann
forall ann. [Doc ann] -> Doc ann
hsep (Doc ann -> [Doc ann] -> [Doc ann]
forall ann. Doc ann -> [Doc ann] -> [Doc ann]
punctuate Doc ann
forall ann. Doc ann
comma (Text -> (BangType -> Doc ann) -> [BangType] -> [Doc ann]
forall a ann. Text -> (a -> Doc ann) -> [a] -> [Doc ann]
listField Text
"args" BangType -> Doc ann
forall ann. BangType -> Doc ann
docBangType [BangType]
args [Doc ann] -> [Doc ann] -> [Doc ann]
forall a. Semigroup a => a -> a -> a
<> [Text -> Doc ann -> Doc ann
forall ann. Text -> Doc ann -> Doc ann
field Text
"result" (Type -> Doc ann
forall ann. Type -> Doc ann
docType Type
resultTy)])))
    GadtRecordBody [FieldDecl]
fields' Type
resultTy ->
      Doc ann
"GadtRecordBody" Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann
braces ([Doc ann] -> Doc ann
forall ann. [Doc ann] -> Doc ann
hsep (Doc ann -> [Doc ann] -> [Doc ann]
forall ann. Doc ann -> [Doc ann] -> [Doc ann]
punctuate Doc ann
forall ann. Doc ann
comma (Text -> (FieldDecl -> Doc ann) -> [FieldDecl] -> [Doc ann]
forall a ann. Text -> (a -> Doc ann) -> [a] -> [Doc ann]
listField Text
"fields" FieldDecl -> Doc ann
forall ann. FieldDecl -> Doc ann
docFieldDecl [FieldDecl]
fields' [Doc ann] -> [Doc ann] -> [Doc ann]
forall a. Semigroup a => a -> a -> a
<> [Text -> Doc ann -> Doc ann
forall ann. Text -> Doc ann -> Doc ann
field Text
"result" (Type -> Doc ann
forall ann. Type -> Doc ann
docType Type
resultTy)])))

docBangType :: BangType -> Doc ann
docBangType :: forall ann. BangType -> Doc ann
docBangType BangType
bt =
  Doc ann
"BangType" Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann
braces ([Doc ann] -> Doc ann
forall ann. [Doc ann] -> Doc ann
hsep (Doc ann -> [Doc ann] -> [Doc ann]
forall ann. Doc ann -> [Doc ann] -> [Doc ann]
punctuate Doc ann
forall ann. Doc ann
comma [Doc ann]
forall {ann}. [Doc ann]
fields))
  where
    fields :: [Doc ann]
fields =
      Text -> Bool -> [Doc ann]
forall ann. Text -> Bool -> [Doc ann]
boolField Text
"strict" (BangType -> Bool
bangStrict BangType
bt)
        [Doc ann] -> [Doc ann] -> [Doc ann]
forall a. Semigroup a => a -> a -> a
<> [Text -> Doc ann -> Doc ann
forall ann. Text -> Doc ann -> Doc ann
field Text
"type" (Type -> Doc ann
forall ann. Type -> Doc ann
docType (BangType -> Type
bangType BangType
bt))]

docFieldDecl :: FieldDecl -> Doc ann
docFieldDecl :: forall ann. FieldDecl -> Doc ann
docFieldDecl FieldDecl
fd =
  Doc ann
"FieldDecl" Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann
braces ([Doc ann] -> Doc ann
forall ann. [Doc ann] -> Doc ann
hsep (Doc ann -> [Doc ann] -> [Doc ann]
forall ann. Doc ann -> [Doc ann] -> [Doc ann]
punctuate Doc ann
forall ann. Doc ann
comma [Text -> Doc ann -> Doc ann
forall ann. Text -> Doc ann -> Doc ann
field Text
"names" ([Text] -> Doc ann
forall ann. [Text] -> Doc ann
docTextList (FieldDecl -> [Text]
fieldNames FieldDecl
fd)), Text -> Doc ann -> Doc ann
forall ann. Text -> Doc ann -> Doc ann
field Text
"type" (BangType -> Doc ann
forall ann. BangType -> Doc ann
docBangType (FieldDecl -> BangType
fieldType FieldDecl
fd))]))

docDerivingClause :: DerivingClause -> Doc ann
docDerivingClause :: forall ann. DerivingClause -> Doc ann
docDerivingClause DerivingClause
dc =
  Doc ann
"DerivingClause" Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann
braces ([Doc ann] -> Doc ann
forall ann. [Doc ann] -> Doc ann
hsep (Doc ann -> [Doc ann] -> [Doc ann]
forall ann. Doc ann -> [Doc ann] -> [Doc ann]
punctuate Doc ann
forall ann. Doc ann
comma [Doc ann]
forall {ann}. [Doc ann]
fields))
  where
    fields :: [Doc ann]
fields =
      Text
-> (DerivingStrategy -> Doc ann)
-> Maybe DerivingStrategy
-> [Doc ann]
forall a ann. Text -> (a -> Doc ann) -> Maybe a -> [Doc ann]
optionalField Text
"strategy" DerivingStrategy -> Doc ann
forall ann. DerivingStrategy -> Doc ann
docDerivingStrategy (DerivingClause -> Maybe DerivingStrategy
derivingStrategy DerivingClause
dc)
        [Doc ann] -> [Doc ann] -> [Doc ann]
forall a. Semigroup a => a -> a -> a
<> Text -> (Text -> Doc ann) -> [Text] -> [Doc ann]
forall a ann. Text -> (a -> Doc ann) -> [a] -> [Doc ann]
listField Text
"classes" Text -> Doc ann
forall ann. Text -> Doc ann
docText (DerivingClause -> [Text]
derivingClasses DerivingClause
dc)

docDerivingStrategy :: DerivingStrategy -> Doc ann
docDerivingStrategy :: forall ann. DerivingStrategy -> Doc ann
docDerivingStrategy DerivingStrategy
ds =
  case DerivingStrategy
ds of
    DerivingStrategy
DerivingStock -> Doc ann
"DerivingStock"
    DerivingStrategy
DerivingNewtype -> Doc ann
"DerivingNewtype"
    DerivingStrategy
DerivingAnyclass -> Doc ann
"DerivingAnyclass"

docClassDecl :: ClassDecl -> Doc ann
docClassDecl :: forall ann. ClassDecl -> Doc ann
docClassDecl ClassDecl
cd =
  Doc ann
"ClassDecl" Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann
braces ([Doc ann] -> Doc ann
forall ann. [Doc ann] -> Doc ann
hsep (Doc ann -> [Doc ann] -> [Doc ann]
forall ann. Doc ann -> [Doc ann] -> [Doc ann]
punctuate Doc ann
forall ann. Doc ann
comma [Doc ann]
forall {ann}. [Doc ann]
fields))
  where
    fields :: [Doc ann]
fields =
      [Text -> Doc ann -> Doc ann
forall ann. Text -> Doc ann -> Doc ann
field Text
"name" (Text -> Doc ann
forall ann. Text -> Doc ann
docText (ClassDecl -> Text
classDeclName ClassDecl
cd))]
        [Doc ann] -> [Doc ann] -> [Doc ann]
forall a. Semigroup a => a -> a -> a
<> Text
-> ([Constraint] -> Doc ann) -> Maybe [Constraint] -> [Doc ann]
forall a ann. Text -> (a -> Doc ann) -> Maybe a -> [Doc ann]
optionalField Text
"context" (Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann
brackets (Doc ann -> Doc ann)
-> ([Constraint] -> Doc ann) -> [Constraint] -> Doc ann
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [Doc ann] -> Doc ann
forall ann. [Doc ann] -> Doc ann
hsep ([Doc ann] -> Doc ann)
-> ([Constraint] -> [Doc ann]) -> [Constraint] -> Doc ann
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Doc ann -> [Doc ann] -> [Doc ann]
forall ann. Doc ann -> [Doc ann] -> [Doc ann]
punctuate Doc ann
forall ann. Doc ann
comma ([Doc ann] -> [Doc ann])
-> ([Constraint] -> [Doc ann]) -> [Constraint] -> [Doc ann]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Constraint -> Doc ann) -> [Constraint] -> [Doc ann]
forall a b. (a -> b) -> [a] -> [b]
map Constraint -> Doc ann
forall ann. Constraint -> Doc ann
docConstraint) (ClassDecl -> Maybe [Constraint]
classDeclContext ClassDecl
cd)
        [Doc ann] -> [Doc ann] -> [Doc ann]
forall a. Semigroup a => a -> a -> a
<> Text -> (TyVarBinder -> Doc ann) -> [TyVarBinder] -> [Doc ann]
forall a ann. Text -> (a -> Doc ann) -> [a] -> [Doc ann]
listField Text
"params" TyVarBinder -> Doc ann
forall ann. TyVarBinder -> Doc ann
docTyVarBinder (ClassDecl -> [TyVarBinder]
classDeclParams ClassDecl
cd)
        [Doc ann] -> [Doc ann] -> [Doc ann]
forall a. Semigroup a => a -> a -> a
<> Text -> (ClassDeclItem -> Doc ann) -> [ClassDeclItem] -> [Doc ann]
forall a ann. Text -> (a -> Doc ann) -> [a] -> [Doc ann]
listField Text
"items" ClassDeclItem -> Doc ann
forall ann. ClassDeclItem -> Doc ann
docClassDeclItem (ClassDecl -> [ClassDeclItem]
classDeclItems ClassDecl
cd)

docClassDeclItem :: ClassDeclItem -> Doc ann
docClassDeclItem :: forall ann. ClassDeclItem -> Doc ann
docClassDeclItem ClassDeclItem
item =
  case ClassDeclItem
item of
    ClassItemTypeSig SourceSpan
_ [Text]
names Type
ty -> Doc ann
"ClassItemTypeSig" Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann
braces ([Doc ann] -> Doc ann
forall ann. [Doc ann] -> Doc ann
hsep (Doc ann -> [Doc ann] -> [Doc ann]
forall ann. Doc ann -> [Doc ann] -> [Doc ann]
punctuate Doc ann
forall ann. Doc ann
comma [Text -> Doc ann -> Doc ann
forall ann. Text -> Doc ann -> Doc ann
field Text
"names" ([Text] -> Doc ann
forall ann. [Text] -> Doc ann
docTextList [Text]
names), Text -> Doc ann -> Doc ann
forall ann. Text -> Doc ann -> Doc ann
field Text
"type" (Type -> Doc ann
forall ann. Type -> Doc ann
docType Type
ty)]))
    ClassItemFixity SourceSpan
_ FixityAssoc
assoc Maybe Int
mPrec [Text]
ops -> Doc ann
"ClassItemFixity" Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann
braces ([Doc ann] -> Doc ann
forall ann. [Doc ann] -> Doc ann
hsep (Doc ann -> [Doc ann] -> [Doc ann]
forall ann. Doc ann -> [Doc ann] -> [Doc ann]
punctuate Doc ann
forall ann. Doc ann
comma ([Text -> Doc ann -> Doc ann
forall ann. Text -> Doc ann -> Doc ann
field Text
"assoc" (FixityAssoc -> Doc ann
forall ann. FixityAssoc -> Doc ann
docFixityAssoc FixityAssoc
assoc)] [Doc ann] -> [Doc ann] -> [Doc ann]
forall a. Semigroup a => a -> a -> a
<> Text -> (Int -> Doc ann) -> Maybe Int -> [Doc ann]
forall a ann. Text -> (a -> Doc ann) -> Maybe a -> [Doc ann]
optionalField Text
"prec" Int -> Doc ann
forall ann. Int -> Doc ann
forall a ann. Pretty a => a -> Doc ann
pretty Maybe Int
mPrec [Doc ann] -> [Doc ann] -> [Doc ann]
forall a. Semigroup a => a -> a -> a
<> [Text -> Doc ann -> Doc ann
forall ann. Text -> Doc ann -> Doc ann
field Text
"ops" ([Text] -> Doc ann
forall ann. [Text] -> Doc ann
docTextList [Text]
ops)])))
    ClassItemDefault SourceSpan
_ ValueDecl
vdecl -> Doc ann
"ClassItemDefault" Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann
parens (ValueDecl -> Doc ann
forall ann. ValueDecl -> Doc ann
docValueDecl ValueDecl
vdecl)

docInstanceDecl :: InstanceDecl -> Doc ann
docInstanceDecl :: forall ann. InstanceDecl -> Doc ann
docInstanceDecl InstanceDecl
inst =
  Doc ann
"InstanceDecl" Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann
braces ([Doc ann] -> Doc ann
forall ann. [Doc ann] -> Doc ann
hsep (Doc ann -> [Doc ann] -> [Doc ann]
forall ann. Doc ann -> [Doc ann] -> [Doc ann]
punctuate Doc ann
forall ann. Doc ann
comma [Doc ann]
forall {ann}. [Doc ann]
fields))
  where
    fields :: [Doc ann]
fields =
      [Text -> Doc ann -> Doc ann
forall ann. Text -> Doc ann -> Doc ann
field Text
"className" (Text -> Doc ann
forall ann. Text -> Doc ann
docText (InstanceDecl -> Text
instanceDeclClassName InstanceDecl
inst))]
        [Doc ann] -> [Doc ann] -> [Doc ann]
forall a. Semigroup a => a -> a -> a
<> Text -> (Constraint -> Doc ann) -> [Constraint] -> [Doc ann]
forall a ann. Text -> (a -> Doc ann) -> [a] -> [Doc ann]
listField Text
"context" Constraint -> Doc ann
forall ann. Constraint -> Doc ann
docConstraint (InstanceDecl -> [Constraint]
instanceDeclContext InstanceDecl
inst)
        [Doc ann] -> [Doc ann] -> [Doc ann]
forall a. Semigroup a => a -> a -> a
<> [Text -> Doc ann -> Doc ann
forall ann. Text -> Doc ann -> Doc ann
field Text
"types" (Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann
brackets ([Doc ann] -> Doc ann
forall ann. [Doc ann] -> Doc ann
hsep (Doc ann -> [Doc ann] -> [Doc ann]
forall ann. Doc ann -> [Doc ann] -> [Doc ann]
punctuate Doc ann
forall ann. Doc ann
comma ((Type -> Doc ann) -> [Type] -> [Doc ann]
forall a b. (a -> b) -> [a] -> [b]
map Type -> Doc ann
forall ann. Type -> Doc ann
docType (InstanceDecl -> [Type]
instanceDeclTypes InstanceDecl
inst)))))]
        [Doc ann] -> [Doc ann] -> [Doc ann]
forall a. Semigroup a => a -> a -> a
<> Text
-> (InstanceDeclItem -> Doc ann) -> [InstanceDeclItem] -> [Doc ann]
forall a ann. Text -> (a -> Doc ann) -> [a] -> [Doc ann]
listField Text
"items" InstanceDeclItem -> Doc ann
forall ann. InstanceDeclItem -> Doc ann
docInstanceDeclItem (InstanceDecl -> [InstanceDeclItem]
instanceDeclItems InstanceDecl
inst)

docInstanceDeclItem :: InstanceDeclItem -> Doc ann
docInstanceDeclItem :: forall ann. InstanceDeclItem -> Doc ann
docInstanceDeclItem InstanceDeclItem
item =
  case InstanceDeclItem
item of
    InstanceItemBind SourceSpan
_ ValueDecl
vdecl -> Doc ann
"InstanceItemBind" Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann
parens (ValueDecl -> Doc ann
forall ann. ValueDecl -> Doc ann
docValueDecl ValueDecl
vdecl)
    InstanceItemTypeSig SourceSpan
_ [Text]
names Type
ty -> Doc ann
"InstanceItemTypeSig" Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann
braces ([Doc ann] -> Doc ann
forall ann. [Doc ann] -> Doc ann
hsep (Doc ann -> [Doc ann] -> [Doc ann]
forall ann. Doc ann -> [Doc ann] -> [Doc ann]
punctuate Doc ann
forall ann. Doc ann
comma [Text -> Doc ann -> Doc ann
forall ann. Text -> Doc ann -> Doc ann
field Text
"names" ([Text] -> Doc ann
forall ann. [Text] -> Doc ann
docTextList [Text]
names), Text -> Doc ann -> Doc ann
forall ann. Text -> Doc ann -> Doc ann
field Text
"type" (Type -> Doc ann
forall ann. Type -> Doc ann
docType Type
ty)]))
    InstanceItemFixity SourceSpan
_ FixityAssoc
assoc Maybe Int
mPrec [Text]
ops -> Doc ann
"InstanceItemFixity" Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann
braces ([Doc ann] -> Doc ann
forall ann. [Doc ann] -> Doc ann
hsep (Doc ann -> [Doc ann] -> [Doc ann]
forall ann. Doc ann -> [Doc ann] -> [Doc ann]
punctuate Doc ann
forall ann. Doc ann
comma ([Text -> Doc ann -> Doc ann
forall ann. Text -> Doc ann -> Doc ann
field Text
"assoc" (FixityAssoc -> Doc ann
forall ann. FixityAssoc -> Doc ann
docFixityAssoc FixityAssoc
assoc)] [Doc ann] -> [Doc ann] -> [Doc ann]
forall a. Semigroup a => a -> a -> a
<> Text -> (Int -> Doc ann) -> Maybe Int -> [Doc ann]
forall a ann. Text -> (a -> Doc ann) -> Maybe a -> [Doc ann]
optionalField Text
"prec" Int -> Doc ann
forall ann. Int -> Doc ann
forall a ann. Pretty a => a -> Doc ann
pretty Maybe Int
mPrec [Doc ann] -> [Doc ann] -> [Doc ann]
forall a. Semigroup a => a -> a -> a
<> [Text -> Doc ann -> Doc ann
forall ann. Text -> Doc ann -> Doc ann
field Text
"ops" ([Text] -> Doc ann
forall ann. [Text] -> Doc ann
docTextList [Text]
ops)])))

docStandaloneDerivingDecl :: StandaloneDerivingDecl -> Doc ann
docStandaloneDerivingDecl :: forall ann. StandaloneDerivingDecl -> Doc ann
docStandaloneDerivingDecl StandaloneDerivingDecl
sd =
  Doc ann
"StandaloneDerivingDecl" Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann
braces ([Doc ann] -> Doc ann
forall ann. [Doc ann] -> Doc ann
hsep (Doc ann -> [Doc ann] -> [Doc ann]
forall ann. Doc ann -> [Doc ann] -> [Doc ann]
punctuate Doc ann
forall ann. Doc ann
comma [Doc ann]
forall {ann}. [Doc ann]
fields))
  where
    fields :: [Doc ann]
fields =
      [Text -> Doc ann -> Doc ann
forall ann. Text -> Doc ann -> Doc ann
field Text
"className" (Text -> Doc ann
forall ann. Text -> Doc ann
docText (StandaloneDerivingDecl -> Text
standaloneDerivingClassName StandaloneDerivingDecl
sd))]
        [Doc ann] -> [Doc ann] -> [Doc ann]
forall a. Semigroup a => a -> a -> a
<> Text
-> (DerivingStrategy -> Doc ann)
-> Maybe DerivingStrategy
-> [Doc ann]
forall a ann. Text -> (a -> Doc ann) -> Maybe a -> [Doc ann]
optionalField Text
"strategy" DerivingStrategy -> Doc ann
forall ann. DerivingStrategy -> Doc ann
docDerivingStrategy (StandaloneDerivingDecl -> Maybe DerivingStrategy
standaloneDerivingStrategy StandaloneDerivingDecl
sd)
        [Doc ann] -> [Doc ann] -> [Doc ann]
forall a. Semigroup a => a -> a -> a
<> Text -> (Constraint -> Doc ann) -> [Constraint] -> [Doc ann]
forall a ann. Text -> (a -> Doc ann) -> [a] -> [Doc ann]
listField Text
"context" Constraint -> Doc ann
forall ann. Constraint -> Doc ann
docConstraint (StandaloneDerivingDecl -> [Constraint]
standaloneDerivingContext StandaloneDerivingDecl
sd)
        [Doc ann] -> [Doc ann] -> [Doc ann]
forall a. Semigroup a => a -> a -> a
<> [Text -> Doc ann -> Doc ann
forall ann. Text -> Doc ann -> Doc ann
field Text
"types" (Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann
brackets ([Doc ann] -> Doc ann
forall ann. [Doc ann] -> Doc ann
hsep (Doc ann -> [Doc ann] -> [Doc ann]
forall ann. Doc ann -> [Doc ann] -> [Doc ann]
punctuate Doc ann
forall ann. Doc ann
comma ((Type -> Doc ann) -> [Type] -> [Doc ann]
forall a b. (a -> b) -> [a] -> [b]
map Type -> Doc ann
forall ann. Type -> Doc ann
docType (StandaloneDerivingDecl -> [Type]
standaloneDerivingTypes StandaloneDerivingDecl
sd)))))]

docForeignDecl :: ForeignDecl -> Doc ann
docForeignDecl :: forall ann. ForeignDecl -> Doc ann
docForeignDecl ForeignDecl
fd =
  Doc ann
"ForeignDecl" Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann
braces ([Doc ann] -> Doc ann
forall ann. [Doc ann] -> Doc ann
hsep (Doc ann -> [Doc ann] -> [Doc ann]
forall ann. Doc ann -> [Doc ann] -> [Doc ann]
punctuate Doc ann
forall ann. Doc ann
comma [Doc ann]
forall {ann}. [Doc ann]
fields))
  where
    fields :: [Doc ann]
fields =
      [Text -> Doc ann -> Doc ann
forall ann. Text -> Doc ann -> Doc ann
field Text
"direction" (ForeignDirection -> Doc ann
forall ann. ForeignDirection -> Doc ann
docForeignDirection (ForeignDecl -> ForeignDirection
foreignDirection ForeignDecl
fd))]
        [Doc ann] -> [Doc ann] -> [Doc ann]
forall a. Semigroup a => a -> a -> a
<> [Text -> Doc ann -> Doc ann
forall ann. Text -> Doc ann -> Doc ann
field Text
"callConv" (CallConv -> Doc ann
forall ann. CallConv -> Doc ann
docCallConv (ForeignDecl -> CallConv
foreignCallConv ForeignDecl
fd))]
        [Doc ann] -> [Doc ann] -> [Doc ann]
forall a. Semigroup a => a -> a -> a
<> Text
-> (ForeignSafety -> Doc ann) -> Maybe ForeignSafety -> [Doc ann]
forall a ann. Text -> (a -> Doc ann) -> Maybe a -> [Doc ann]
optionalField Text
"safety" ForeignSafety -> Doc ann
forall ann. ForeignSafety -> Doc ann
docForeignSafety (ForeignDecl -> Maybe ForeignSafety
foreignSafety ForeignDecl
fd)
        [Doc ann] -> [Doc ann] -> [Doc ann]
forall a. Semigroup a => a -> a -> a
<> [Text -> Doc ann -> Doc ann
forall ann. Text -> Doc ann -> Doc ann
field Text
"entity" (ForeignEntitySpec -> Doc ann
forall ann. ForeignEntitySpec -> Doc ann
docForeignEntitySpec (ForeignDecl -> ForeignEntitySpec
foreignEntity ForeignDecl
fd))]
        [Doc ann] -> [Doc ann] -> [Doc ann]
forall a. Semigroup a => a -> a -> a
<> [Text -> Doc ann -> Doc ann
forall ann. Text -> Doc ann -> Doc ann
field Text
"name" (Text -> Doc ann
forall ann. Text -> Doc ann
docText (ForeignDecl -> Text
foreignName ForeignDecl
fd))]
        [Doc ann] -> [Doc ann] -> [Doc ann]
forall a. Semigroup a => a -> a -> a
<> [Text -> Doc ann -> Doc ann
forall ann. Text -> Doc ann -> Doc ann
field Text
"type" (Type -> Doc ann
forall ann. Type -> Doc ann
docType (ForeignDecl -> Type
foreignType ForeignDecl
fd))]

docForeignDirection :: ForeignDirection -> Doc ann
docForeignDirection :: forall ann. ForeignDirection -> Doc ann
docForeignDirection ForeignDirection
fd =
  case ForeignDirection
fd of
    ForeignDirection
ForeignImport -> Doc ann
"ForeignImport"
    ForeignDirection
ForeignExport -> Doc ann
"ForeignExport"

docCallConv :: CallConv -> Doc ann
docCallConv :: forall ann. CallConv -> Doc ann
docCallConv CallConv
cc =
  case CallConv
cc of
    CallConv
CCall -> Doc ann
"CCall"
    CallConv
StdCall -> Doc ann
"StdCall"

docForeignSafety :: ForeignSafety -> Doc ann
docForeignSafety :: forall ann. ForeignSafety -> Doc ann
docForeignSafety ForeignSafety
fs =
  case ForeignSafety
fs of
    ForeignSafety
Safe -> Doc ann
"Safe"
    ForeignSafety
Unsafe -> Doc ann
"Unsafe"

docForeignEntitySpec :: ForeignEntitySpec -> Doc ann
docForeignEntitySpec :: forall ann. ForeignEntitySpec -> Doc ann
docForeignEntitySpec ForeignEntitySpec
spec =
  case ForeignEntitySpec
spec of
    ForeignEntitySpec
ForeignEntityDynamic -> Doc ann
"ForeignEntityDynamic"
    ForeignEntitySpec
ForeignEntityWrapper -> Doc ann
"ForeignEntityWrapper"
    ForeignEntityStatic Maybe Text
mName -> Doc ann
"ForeignEntityStatic" Doc ann -> Doc ann -> Doc ann
forall a. Semigroup a => a -> a -> a
<> (Text -> Doc ann) -> Maybe Text -> Doc ann
forall a ann. (a -> Doc ann) -> Maybe a -> Doc ann
optionalField' Text -> Doc ann
forall ann. Text -> Doc ann
docText Maybe Text
mName
    ForeignEntityAddress Maybe Text
mName -> Doc ann
"ForeignEntityAddress" Doc ann -> Doc ann -> Doc ann
forall a. Semigroup a => a -> a -> a
<> (Text -> Doc ann) -> Maybe Text -> Doc ann
forall a ann. (a -> Doc ann) -> Maybe a -> Doc ann
optionalField' Text -> Doc ann
forall ann. Text -> Doc ann
docText Maybe Text
mName
    ForeignEntityNamed Text
name -> Doc ann
"ForeignEntityNamed" Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> Text -> Doc ann
forall ann. Text -> Doc ann
docText Text
name
    ForeignEntitySpec
ForeignEntityOmitted -> Doc ann
"ForeignEntityOmitted"

docFixityAssoc :: FixityAssoc -> Doc ann
docFixityAssoc :: forall ann. FixityAssoc -> Doc ann
docFixityAssoc FixityAssoc
fa =
  case FixityAssoc
fa of
    FixityAssoc
Infix -> Doc ann
"Infix"
    FixityAssoc
InfixL -> Doc ann
"InfixL"
    FixityAssoc
InfixR -> Doc ann
"InfixR"

-- Types

docType :: Type -> Doc ann
docType :: forall ann. Type -> Doc ann
docType Type
ty =
  case Type
ty of
    TVar SourceSpan
_ Text
name -> Doc ann
"TVar" Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> Text -> Doc ann
forall ann. Text -> Doc ann
docText Text
name
    TCon SourceSpan
_ Text
name TypePromotion
promoted ->
      if TypePromotion
promoted TypePromotion -> TypePromotion -> Bool
forall a. Eq a => a -> a -> Bool
== TypePromotion
Promoted
        then Doc ann
"TConPromoted" Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> Text -> Doc ann
forall ann. Text -> Doc ann
docText Text
name
        else Doc ann
"TCon" Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> Text -> Doc ann
forall ann. Text -> Doc ann
docText Text
name
    TTypeLit SourceSpan
_ TypeLiteral
lit -> Doc ann
"TTypeLit" Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> TypeLiteral -> Doc ann
forall ann. TypeLiteral -> Doc ann
docTypeLiteral TypeLiteral
lit
    TStar SourceSpan
_ -> Doc ann
"TStar"
    TQuasiQuote SourceSpan
_ Text
quoter Text
body -> Doc ann
"TQuasiQuote" Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> Text -> Doc ann
forall ann. Text -> Doc ann
docText Text
quoter Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> Text -> Doc ann
forall ann. Text -> Doc ann
docText Text
body
    TForall SourceSpan
_ [Text]
binders Type
inner -> Doc ann
"TForall" Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann
brackets ([Doc ann] -> Doc ann
forall ann. [Doc ann] -> Doc ann
hsep (Doc ann -> [Doc ann] -> [Doc ann]
forall ann. Doc ann -> [Doc ann] -> [Doc ann]
punctuate Doc ann
forall ann. Doc ann
comma ((Text -> Doc ann) -> [Text] -> [Doc ann]
forall a b. (a -> b) -> [a] -> [b]
map Text -> Doc ann
forall ann. Text -> Doc ann
docText [Text]
binders))) Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann
parens (Type -> Doc ann
forall ann. Type -> Doc ann
docType Type
inner)
    TApp SourceSpan
_ Type
f Type
x -> Doc ann
"TApp" Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann
parens (Type -> Doc ann
forall ann. Type -> Doc ann
docType Type
f) Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann
parens (Type -> Doc ann
forall ann. Type -> Doc ann
docType Type
x)
    TFun SourceSpan
_ Type
a Type
b -> Doc ann
"TFun" Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann
parens (Type -> Doc ann
forall ann. Type -> Doc ann
docType Type
a) Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann
parens (Type -> Doc ann
forall ann. Type -> Doc ann
docType Type
b)
    TTuple SourceSpan
_ TypePromotion
promoted [Type]
elems ->
      (if TypePromotion
promoted TypePromotion -> TypePromotion -> Bool
forall a. Eq a => a -> a -> Bool
== TypePromotion
Promoted then Doc ann
"TTuplePromoted" else Doc ann
"TTuple")
        Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann
brackets ([Doc ann] -> Doc ann
forall ann. [Doc ann] -> Doc ann
hsep (Doc ann -> [Doc ann] -> [Doc ann]
forall ann. Doc ann -> [Doc ann] -> [Doc ann]
punctuate Doc ann
forall ann. Doc ann
comma ((Type -> Doc ann) -> [Type] -> [Doc ann]
forall a b. (a -> b) -> [a] -> [b]
map Type -> Doc ann
forall ann. Type -> Doc ann
docType [Type]
elems)))
    TList SourceSpan
_ TypePromotion
promoted Type
inner ->
      (if TypePromotion
promoted TypePromotion -> TypePromotion -> Bool
forall a. Eq a => a -> a -> Bool
== TypePromotion
Promoted then Doc ann
"TListPromoted" else Doc ann
"TList")
        Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann
parens (Type -> Doc ann
forall ann. Type -> Doc ann
docType Type
inner)
    TParen SourceSpan
_ Type
inner -> Doc ann
"TParen" Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann
parens (Type -> Doc ann
forall ann. Type -> Doc ann
docType Type
inner)
    TContext SourceSpan
_ [Constraint]
constraints Type
inner -> Doc ann
"TContext" Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann
brackets ([Doc ann] -> Doc ann
forall ann. [Doc ann] -> Doc ann
hsep (Doc ann -> [Doc ann] -> [Doc ann]
forall ann. Doc ann -> [Doc ann] -> [Doc ann]
punctuate Doc ann
forall ann. Doc ann
comma ((Constraint -> Doc ann) -> [Constraint] -> [Doc ann]
forall a b. (a -> b) -> [a] -> [b]
map Constraint -> Doc ann
forall ann. Constraint -> Doc ann
docConstraint [Constraint]
constraints))) Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann
parens (Type -> Doc ann
forall ann. Type -> Doc ann
docType Type
inner)

docTypeLiteral :: TypeLiteral -> Doc ann
docTypeLiteral :: forall ann. TypeLiteral -> Doc ann
docTypeLiteral TypeLiteral
lit =
  case TypeLiteral
lit of
    TypeLitInteger Integer
n Text
_ -> Doc ann
"TypeLitInteger" Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> Integer -> Doc ann
forall ann. Integer -> Doc ann
forall a ann. Pretty a => a -> Doc ann
pretty Integer
n
    TypeLitSymbol Text
s Text
_ -> Doc ann
"TypeLitSymbol" Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> Text -> Doc ann
forall ann. Text -> Doc ann
docText Text
s
    TypeLitChar Char
c Text
_ -> Doc ann
"TypeLitChar" Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> String -> Doc ann
forall ann. String -> Doc ann
forall a ann. Pretty a => a -> Doc ann
pretty (Char -> String
forall a. Show a => a -> String
show Char
c)

docConstraint :: Constraint -> Doc ann
docConstraint :: forall ann. Constraint -> Doc ann
docConstraint Constraint
c =
  Doc ann
"Constraint" Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann
braces ([Doc ann] -> Doc ann
forall ann. [Doc ann] -> Doc ann
hsep (Doc ann -> [Doc ann] -> [Doc ann]
forall ann. Doc ann -> [Doc ann] -> [Doc ann]
punctuate Doc ann
forall ann. Doc ann
comma [Doc ann]
forall {ann}. [Doc ann]
fields))
  where
    fields :: [Doc ann]
fields =
      [Text -> Doc ann -> Doc ann
forall ann. Text -> Doc ann -> Doc ann
field Text
"class" (Text -> Doc ann
forall ann. Text -> Doc ann
docText (Constraint -> Text
constraintClass Constraint
c))]
        [Doc ann] -> [Doc ann] -> [Doc ann]
forall a. Semigroup a => a -> a -> a
<> Text -> (Type -> Doc ann) -> [Type] -> [Doc ann]
forall a ann. Text -> (a -> Doc ann) -> [a] -> [Doc ann]
listField Text
"args" Type -> Doc ann
forall ann. Type -> Doc ann
docType (Constraint -> [Type]
constraintArgs Constraint
c)
        [Doc ann] -> [Doc ann] -> [Doc ann]
forall a. Semigroup a => a -> a -> a
<> Text -> Bool -> [Doc ann]
forall ann. Text -> Bool -> [Doc ann]
boolField Text
"paren" (Constraint -> Bool
constraintParen Constraint
c)

docTyVarBinder :: TyVarBinder -> Doc ann
docTyVarBinder :: forall ann. TyVarBinder -> Doc ann
docTyVarBinder TyVarBinder
tvb =
  Doc ann
"TyVarBinder" Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann
braces ([Doc ann] -> Doc ann
forall ann. [Doc ann] -> Doc ann
hsep (Doc ann -> [Doc ann] -> [Doc ann]
forall ann. Doc ann -> [Doc ann] -> [Doc ann]
punctuate Doc ann
forall ann. Doc ann
comma [Doc ann]
forall {ann}. [Doc ann]
fields))
  where
    fields :: [Doc ann]
fields =
      [Text -> Doc ann -> Doc ann
forall ann. Text -> Doc ann -> Doc ann
field Text
"name" (Text -> Doc ann
forall ann. Text -> Doc ann
docText (TyVarBinder -> Text
tyVarBinderName TyVarBinder
tvb))]
        [Doc ann] -> [Doc ann] -> [Doc ann]
forall a. Semigroup a => a -> a -> a
<> Text -> (Type -> Doc ann) -> Maybe Type -> [Doc ann]
forall a ann. Text -> (a -> Doc ann) -> Maybe a -> [Doc ann]
optionalField Text
"kind" Type -> Doc ann
forall ann. Type -> Doc ann
docType (TyVarBinder -> Maybe Type
tyVarBinderKind TyVarBinder
tvb)

-- Patterns

docPattern :: Pattern -> Doc ann
docPattern :: forall ann. Pattern -> Doc ann
docPattern Pattern
pat =
  case Pattern
pat of
    PVar SourceSpan
_ Text
name -> Doc ann
"PVar" Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> Text -> Doc ann
forall ann. Text -> Doc ann
docText Text
name
    PWildcard SourceSpan
_ -> Doc ann
"PWildcard"
    PLit SourceSpan
_ Literal
lit -> Doc ann
"PLit" Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann
parens (Literal -> Doc ann
forall ann. Literal -> Doc ann
docLiteral Literal
lit)
    PQuasiQuote SourceSpan
_ Text
quoter Text
body -> Doc ann
"PQuasiQuote" Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> Text -> Doc ann
forall ann. Text -> Doc ann
docText Text
quoter Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> Text -> Doc ann
forall ann. Text -> Doc ann
docText Text
body
    PTuple SourceSpan
_ [Pattern]
elems -> Doc ann
"PTuple" Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann
brackets ([Doc ann] -> Doc ann
forall ann. [Doc ann] -> Doc ann
hsep (Doc ann -> [Doc ann] -> [Doc ann]
forall ann. Doc ann -> [Doc ann] -> [Doc ann]
punctuate Doc ann
forall ann. Doc ann
comma ((Pattern -> Doc ann) -> [Pattern] -> [Doc ann]
forall a b. (a -> b) -> [a] -> [b]
map Pattern -> Doc ann
forall ann. Pattern -> Doc ann
docPattern [Pattern]
elems)))
    PList SourceSpan
_ [Pattern]
elems -> Doc ann
"PList" Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann
brackets ([Doc ann] -> Doc ann
forall ann. [Doc ann] -> Doc ann
hsep (Doc ann -> [Doc ann] -> [Doc ann]
forall ann. Doc ann -> [Doc ann] -> [Doc ann]
punctuate Doc ann
forall ann. Doc ann
comma ((Pattern -> Doc ann) -> [Pattern] -> [Doc ann]
forall a b. (a -> b) -> [a] -> [b]
map Pattern -> Doc ann
forall ann. Pattern -> Doc ann
docPattern [Pattern]
elems)))
    PCon SourceSpan
_ Text
name [Pattern]
args -> Doc ann
"PCon" Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> Text -> Doc ann
forall ann. Text -> Doc ann
docText Text
name Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann
brackets ([Doc ann] -> Doc ann
forall ann. [Doc ann] -> Doc ann
hsep (Doc ann -> [Doc ann] -> [Doc ann]
forall ann. Doc ann -> [Doc ann] -> [Doc ann]
punctuate Doc ann
forall ann. Doc ann
comma ((Pattern -> Doc ann) -> [Pattern] -> [Doc ann]
forall a b. (a -> b) -> [a] -> [b]
map Pattern -> Doc ann
forall ann. Pattern -> Doc ann
docPattern [Pattern]
args)))
    PInfix SourceSpan
_ Pattern
lhs Text
op Pattern
rhs -> Doc ann
"PInfix" Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann
parens (Pattern -> Doc ann
forall ann. Pattern -> Doc ann
docPattern Pattern
lhs) Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> Text -> Doc ann
forall ann. Text -> Doc ann
docText Text
op Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann
parens (Pattern -> Doc ann
forall ann. Pattern -> Doc ann
docPattern Pattern
rhs)
    PView SourceSpan
_ Expr
expr Pattern
inner -> Doc ann
"PView" Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann
parens (Expr -> Doc ann
forall ann. Expr -> Doc ann
docExpr Expr
expr) Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann
parens (Pattern -> Doc ann
forall ann. Pattern -> Doc ann
docPattern Pattern
inner)
    PAs SourceSpan
_ Text
name Pattern
inner -> Doc ann
"PAs" Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> Text -> Doc ann
forall ann. Text -> Doc ann
docText Text
name Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann
parens (Pattern -> Doc ann
forall ann. Pattern -> Doc ann
docPattern Pattern
inner)
    PStrict SourceSpan
_ Pattern
inner -> Doc ann
"PStrict" Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann
parens (Pattern -> Doc ann
forall ann. Pattern -> Doc ann
docPattern Pattern
inner)
    PIrrefutable SourceSpan
_ Pattern
inner -> Doc ann
"PIrrefutable" Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann
parens (Pattern -> Doc ann
forall ann. Pattern -> Doc ann
docPattern Pattern
inner)
    PNegLit SourceSpan
_ Literal
lit -> Doc ann
"PNegLit" Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann
parens (Literal -> Doc ann
forall ann. Literal -> Doc ann
docLiteral Literal
lit)
    PParen SourceSpan
_ Pattern
inner -> Doc ann
"PParen" Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann
parens (Pattern -> Doc ann
forall ann. Pattern -> Doc ann
docPattern Pattern
inner)
    PRecord SourceSpan
_ Text
name [(Text, Pattern)]
fields' -> Doc ann
"PRecord" Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> Text -> Doc ann
forall ann. Text -> Doc ann
docText Text
name Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann
braces ([Doc ann] -> Doc ann
forall ann. [Doc ann] -> Doc ann
hsep (Doc ann -> [Doc ann] -> [Doc ann]
forall ann. Doc ann -> [Doc ann] -> [Doc ann]
punctuate Doc ann
forall ann. Doc ann
comma [Text -> Doc ann
forall ann. Text -> Doc ann
docText Text
fn Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> Doc ann
"=" Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> Pattern -> Doc ann
forall ann. Pattern -> Doc ann
docPattern Pattern
fp | (Text
fn, Pattern
fp) <- [(Text, Pattern)]
fields']))

docLiteral :: Literal -> Doc ann
docLiteral :: forall ann. Literal -> Doc ann
docLiteral Literal
lit =
  case Literal
lit of
    LitInt SourceSpan
_ Integer
n Text
_ -> Doc ann
"LitInt" Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> Integer -> Doc ann
forall ann. Integer -> Doc ann
forall a ann. Pretty a => a -> Doc ann
pretty Integer
n
    LitIntBase SourceSpan
_ Integer
n Text
repr -> Doc ann
"LitIntBase" Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> Integer -> Doc ann
forall ann. Integer -> Doc ann
forall a ann. Pretty a => a -> Doc ann
pretty Integer
n Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> Text -> Doc ann
forall ann. Text -> Doc ann
docText Text
repr
    LitFloat SourceSpan
_ Double
n Text
_ -> Doc ann
"LitFloat" Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> Double -> Doc ann
forall ann. Double -> Doc ann
forall a ann. Pretty a => a -> Doc ann
pretty Double
n
    LitChar SourceSpan
_ Char
c Text
_ -> Doc ann
"LitChar" Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> String -> Doc ann
forall ann. String -> Doc ann
forall a ann. Pretty a => a -> Doc ann
pretty (Char -> String
forall a. Show a => a -> String
show Char
c)
    LitString SourceSpan
_ Text
s Text
_ -> Doc ann
"LitString" Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> Text -> Doc ann
forall ann. Text -> Doc ann
docText Text
s

-- Expressions

docExpr :: Expr -> Doc ann
docExpr :: forall ann. Expr -> Doc ann
docExpr Expr
expr =
  case Expr
expr of
    EVar SourceSpan
_ Text
name -> Doc ann
"EVar" Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> Text -> Doc ann
forall ann. Text -> Doc ann
docText Text
name
    EInt SourceSpan
_ Integer
n Text
_ -> Doc ann
"EInt" Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> Integer -> Doc ann
forall ann. Integer -> Doc ann
forall a ann. Pretty a => a -> Doc ann
pretty Integer
n
    EIntBase SourceSpan
_ Integer
n Text
repr -> Doc ann
"EIntBase" Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> Integer -> Doc ann
forall ann. Integer -> Doc ann
forall a ann. Pretty a => a -> Doc ann
pretty Integer
n Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> Text -> Doc ann
forall ann. Text -> Doc ann
docText Text
repr
    EFloat SourceSpan
_ Double
n Text
_ -> Doc ann
"EFloat" Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> Double -> Doc ann
forall ann. Double -> Doc ann
forall a ann. Pretty a => a -> Doc ann
pretty Double
n
    EChar SourceSpan
_ Char
c Text
_ -> Doc ann
"EChar" Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> String -> Doc ann
forall ann. String -> Doc ann
forall a ann. Pretty a => a -> Doc ann
pretty (Char -> String
forall a. Show a => a -> String
show Char
c)
    EString SourceSpan
_ Text
s Text
_ -> Doc ann
"EString" Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> Text -> Doc ann
forall ann. Text -> Doc ann
docText Text
s
    EQuasiQuote SourceSpan
_ Text
quoter Text
body -> Doc ann
"EQuasiQuote" Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> Text -> Doc ann
forall ann. Text -> Doc ann
docText Text
quoter Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> Text -> Doc ann
forall ann. Text -> Doc ann
docText Text
body
    EIf SourceSpan
_ Expr
cond Expr
yes Expr
no -> Doc ann
"EIf" Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann
parens (Expr -> Doc ann
forall ann. Expr -> Doc ann
docExpr Expr
cond) Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann
parens (Expr -> Doc ann
forall ann. Expr -> Doc ann
docExpr Expr
yes) Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann
parens (Expr -> Doc ann
forall ann. Expr -> Doc ann
docExpr Expr
no)
    ELambdaPats SourceSpan
_ [Pattern]
pats Expr
body -> Doc ann
"ELambdaPats" Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann
brackets ([Doc ann] -> Doc ann
forall ann. [Doc ann] -> Doc ann
hsep (Doc ann -> [Doc ann] -> [Doc ann]
forall ann. Doc ann -> [Doc ann] -> [Doc ann]
punctuate Doc ann
forall ann. Doc ann
comma ((Pattern -> Doc ann) -> [Pattern] -> [Doc ann]
forall a b. (a -> b) -> [a] -> [b]
map Pattern -> Doc ann
forall ann. Pattern -> Doc ann
docPattern [Pattern]
pats))) Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann
parens (Expr -> Doc ann
forall ann. Expr -> Doc ann
docExpr Expr
body)
    ELambdaCase SourceSpan
_ [CaseAlt]
alts -> Doc ann
"ELambdaCase" Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann
brackets ([Doc ann] -> Doc ann
forall ann. [Doc ann] -> Doc ann
hsep (Doc ann -> [Doc ann] -> [Doc ann]
forall ann. Doc ann -> [Doc ann] -> [Doc ann]
punctuate Doc ann
forall ann. Doc ann
comma ((CaseAlt -> Doc ann) -> [CaseAlt] -> [Doc ann]
forall a b. (a -> b) -> [a] -> [b]
map CaseAlt -> Doc ann
forall ann. CaseAlt -> Doc ann
docCaseAlt [CaseAlt]
alts)))
    EInfix SourceSpan
_ Expr
lhs Text
op Expr
rhs -> Doc ann
"EInfix" Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann
parens (Expr -> Doc ann
forall ann. Expr -> Doc ann
docExpr Expr
lhs) Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> Text -> Doc ann
forall ann. Text -> Doc ann
docText Text
op Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann
parens (Expr -> Doc ann
forall ann. Expr -> Doc ann
docExpr Expr
rhs)
    ENegate SourceSpan
_ Expr
inner -> Doc ann
"ENegate" Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann
parens (Expr -> Doc ann
forall ann. Expr -> Doc ann
docExpr Expr
inner)
    ESectionL SourceSpan
_ Expr
lhs Text
op -> Doc ann
"ESectionL" Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann
parens (Expr -> Doc ann
forall ann. Expr -> Doc ann
docExpr Expr
lhs) Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> Text -> Doc ann
forall ann. Text -> Doc ann
docText Text
op
    ESectionR SourceSpan
_ Text
op Expr
rhs -> Doc ann
"ESectionR" Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> Text -> Doc ann
forall ann. Text -> Doc ann
docText Text
op Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann
parens (Expr -> Doc ann
forall ann. Expr -> Doc ann
docExpr Expr
rhs)
    ELetDecls SourceSpan
_ [Decl]
decls Expr
body -> Doc ann
"ELetDecls" Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann
brackets ([Doc ann] -> Doc ann
forall ann. [Doc ann] -> Doc ann
hsep (Doc ann -> [Doc ann] -> [Doc ann]
forall ann. Doc ann -> [Doc ann] -> [Doc ann]
punctuate Doc ann
forall ann. Doc ann
comma ((Decl -> Doc ann) -> [Decl] -> [Doc ann]
forall a b. (a -> b) -> [a] -> [b]
map Decl -> Doc ann
forall ann. Decl -> Doc ann
docDecl [Decl]
decls))) Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann
parens (Expr -> Doc ann
forall ann. Expr -> Doc ann
docExpr Expr
body)
    ECase SourceSpan
_ Expr
scrutinee [CaseAlt]
alts -> Doc ann
"ECase" Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann
parens (Expr -> Doc ann
forall ann. Expr -> Doc ann
docExpr Expr
scrutinee) Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann
brackets ([Doc ann] -> Doc ann
forall ann. [Doc ann] -> Doc ann
hsep (Doc ann -> [Doc ann] -> [Doc ann]
forall ann. Doc ann -> [Doc ann] -> [Doc ann]
punctuate Doc ann
forall ann. Doc ann
comma ((CaseAlt -> Doc ann) -> [CaseAlt] -> [Doc ann]
forall a b. (a -> b) -> [a] -> [b]
map CaseAlt -> Doc ann
forall ann. CaseAlt -> Doc ann
docCaseAlt [CaseAlt]
alts)))
    EDo SourceSpan
_ [DoStmt]
stmts -> Doc ann
"EDo" Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann
brackets ([Doc ann] -> Doc ann
forall ann. [Doc ann] -> Doc ann
hsep (Doc ann -> [Doc ann] -> [Doc ann]
forall ann. Doc ann -> [Doc ann] -> [Doc ann]
punctuate Doc ann
forall ann. Doc ann
comma ((DoStmt -> Doc ann) -> [DoStmt] -> [Doc ann]
forall a b. (a -> b) -> [a] -> [b]
map DoStmt -> Doc ann
forall ann. DoStmt -> Doc ann
docDoStmt [DoStmt]
stmts)))
    EListComp SourceSpan
_ Expr
body [CompStmt]
quals -> Doc ann
"EListComp" Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann
parens (Expr -> Doc ann
forall ann. Expr -> Doc ann
docExpr Expr
body) Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann
brackets ([Doc ann] -> Doc ann
forall ann. [Doc ann] -> Doc ann
hsep (Doc ann -> [Doc ann] -> [Doc ann]
forall ann. Doc ann -> [Doc ann] -> [Doc ann]
punctuate Doc ann
forall ann. Doc ann
comma ((CompStmt -> Doc ann) -> [CompStmt] -> [Doc ann]
forall a b. (a -> b) -> [a] -> [b]
map CompStmt -> Doc ann
forall ann. CompStmt -> Doc ann
docCompStmt [CompStmt]
quals)))
    EListCompParallel SourceSpan
_ Expr
body [[CompStmt]]
qualGroups -> Doc ann
"EListCompParallel" Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann
parens (Expr -> Doc ann
forall ann. Expr -> Doc ann
docExpr Expr
body) Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann
brackets ([Doc ann] -> Doc ann
forall ann. [Doc ann] -> Doc ann
hsep (Doc ann -> [Doc ann] -> [Doc ann]
forall ann. Doc ann -> [Doc ann] -> [Doc ann]
punctuate Doc ann
"|" [Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann
brackets ([Doc ann] -> Doc ann
forall ann. [Doc ann] -> Doc ann
hsep (Doc ann -> [Doc ann] -> [Doc ann]
forall ann. Doc ann -> [Doc ann] -> [Doc ann]
punctuate Doc ann
forall ann. Doc ann
comma ((CompStmt -> Doc ann) -> [CompStmt] -> [Doc ann]
forall a b. (a -> b) -> [a] -> [b]
map CompStmt -> Doc ann
forall ann. CompStmt -> Doc ann
docCompStmt [CompStmt]
qs))) | [CompStmt]
qs <- [[CompStmt]]
qualGroups]))
    EArithSeq SourceSpan
_ ArithSeq
seqInfo -> Doc ann
"EArithSeq" Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann
parens (ArithSeq -> Doc ann
forall ann. ArithSeq -> Doc ann
docArithSeq ArithSeq
seqInfo)
    ERecordCon SourceSpan
_ Text
name [(Text, Expr)]
fields' -> Doc ann
"ERecordCon" Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> Text -> Doc ann
forall ann. Text -> Doc ann
docText Text
name Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann
braces ([Doc ann] -> Doc ann
forall ann. [Doc ann] -> Doc ann
hsep (Doc ann -> [Doc ann] -> [Doc ann]
forall ann. Doc ann -> [Doc ann] -> [Doc ann]
punctuate Doc ann
forall ann. Doc ann
comma [Text -> Doc ann
forall ann. Text -> Doc ann
docText Text
fn Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> Doc ann
"=" Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> Expr -> Doc ann
forall ann. Expr -> Doc ann
docExpr Expr
fv | (Text
fn, Expr
fv) <- [(Text, Expr)]
fields']))
    ERecordUpd SourceSpan
_ Expr
base [(Text, Expr)]
fields' -> Doc ann
"ERecordUpd" Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann
parens (Expr -> Doc ann
forall ann. Expr -> Doc ann
docExpr Expr
base) Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann
braces ([Doc ann] -> Doc ann
forall ann. [Doc ann] -> Doc ann
hsep (Doc ann -> [Doc ann] -> [Doc ann]
forall ann. Doc ann -> [Doc ann] -> [Doc ann]
punctuate Doc ann
forall ann. Doc ann
comma [Text -> Doc ann
forall ann. Text -> Doc ann
docText Text
fn Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> Doc ann
"=" Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> Expr -> Doc ann
forall ann. Expr -> Doc ann
docExpr Expr
fv | (Text
fn, Expr
fv) <- [(Text, Expr)]
fields']))
    ETypeSig SourceSpan
_ Expr
inner Type
ty -> Doc ann
"ETypeSig" Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann
parens (Expr -> Doc ann
forall ann. Expr -> Doc ann
docExpr Expr
inner) Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann
parens (Type -> Doc ann
forall ann. Type -> Doc ann
docType Type
ty)
    EParen SourceSpan
_ Expr
inner -> Doc ann
"EParen" Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann
parens (Expr -> Doc ann
forall ann. Expr -> Doc ann
docExpr Expr
inner)
    EWhereDecls SourceSpan
_ Expr
body [Decl]
decls -> Doc ann
"EWhereDecls" Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann
parens (Expr -> Doc ann
forall ann. Expr -> Doc ann
docExpr Expr
body) Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann
brackets ([Doc ann] -> Doc ann
forall ann. [Doc ann] -> Doc ann
hsep (Doc ann -> [Doc ann] -> [Doc ann]
forall ann. Doc ann -> [Doc ann] -> [Doc ann]
punctuate Doc ann
forall ann. Doc ann
comma ((Decl -> Doc ann) -> [Decl] -> [Doc ann]
forall a b. (a -> b) -> [a] -> [b]
map Decl -> Doc ann
forall ann. Decl -> Doc ann
docDecl [Decl]
decls)))
    EList SourceSpan
_ [Expr]
elems -> Doc ann
"EList" Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann
brackets ([Doc ann] -> Doc ann
forall ann. [Doc ann] -> Doc ann
hsep (Doc ann -> [Doc ann] -> [Doc ann]
forall ann. Doc ann -> [Doc ann] -> [Doc ann]
punctuate Doc ann
forall ann. Doc ann
comma ((Expr -> Doc ann) -> [Expr] -> [Doc ann]
forall a b. (a -> b) -> [a] -> [b]
map Expr -> Doc ann
forall ann. Expr -> Doc ann
docExpr [Expr]
elems)))
    ETuple SourceSpan
_ [Expr]
elems -> Doc ann
"ETuple" Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann
brackets ([Doc ann] -> Doc ann
forall ann. [Doc ann] -> Doc ann
hsep (Doc ann -> [Doc ann] -> [Doc ann]
forall ann. Doc ann -> [Doc ann] -> [Doc ann]
punctuate Doc ann
forall ann. Doc ann
comma ((Expr -> Doc ann) -> [Expr] -> [Doc ann]
forall a b. (a -> b) -> [a] -> [b]
map Expr -> Doc ann
forall ann. Expr -> Doc ann
docExpr [Expr]
elems)))
    ETupleSection SourceSpan
_ [Maybe Expr]
elems -> Doc ann
"ETupleSection" Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann
brackets ([Doc ann] -> Doc ann
forall ann. [Doc ann] -> Doc ann
hsep (Doc ann -> [Doc ann] -> [Doc ann]
forall ann. Doc ann -> [Doc ann] -> [Doc ann]
punctuate Doc ann
forall ann. Doc ann
comma ((Maybe Expr -> Doc ann) -> [Maybe Expr] -> [Doc ann]
forall a b. (a -> b) -> [a] -> [b]
map (Doc ann -> (Expr -> Doc ann) -> Maybe Expr -> Doc ann
forall b a. b -> (a -> b) -> Maybe a -> b
maybe Doc ann
"_" Expr -> Doc ann
forall ann. Expr -> Doc ann
docExpr) [Maybe Expr]
elems)))
    ETupleCon SourceSpan
_ Int
arity -> Doc ann
"ETupleCon" Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> Int -> Doc ann
forall ann. Int -> Doc ann
forall a ann. Pretty a => a -> Doc ann
pretty Int
arity
    ETypeApp SourceSpan
_ Expr
inner Type
ty -> Doc ann
"ETypeApp" Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann
parens (Expr -> Doc ann
forall ann. Expr -> Doc ann
docExpr Expr
inner) Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann
parens (Type -> Doc ann
forall ann. Type -> Doc ann
docType Type
ty)
    EApp SourceSpan
_ Expr
f Expr
x -> Doc ann
"EApp" Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann
parens (Expr -> Doc ann
forall ann. Expr -> Doc ann
docExpr Expr
f) Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann
parens (Expr -> Doc ann
forall ann. Expr -> Doc ann
docExpr Expr
x)

docCaseAlt :: CaseAlt -> Doc ann
docCaseAlt :: forall ann. CaseAlt -> Doc ann
docCaseAlt (CaseAlt SourceSpan
_ Pattern
pat Rhs
rhs) =
  Doc ann
"CaseAlt" Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann
parens (Pattern -> Doc ann
forall ann. Pattern -> Doc ann
docPattern Pattern
pat) Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann
parens (Rhs -> Doc ann
forall ann. Rhs -> Doc ann
docRhs Rhs
rhs)

docDoStmt :: DoStmt -> Doc ann
docDoStmt :: forall ann. DoStmt -> Doc ann
docDoStmt DoStmt
stmt =
  case DoStmt
stmt of
    DoBind SourceSpan
_ Pattern
pat Expr
expr -> Doc ann
"DoBind" Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann
parens (Pattern -> Doc ann
forall ann. Pattern -> Doc ann
docPattern Pattern
pat) Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann
parens (Expr -> Doc ann
forall ann. Expr -> Doc ann
docExpr Expr
expr)
    DoLet SourceSpan
_ [(Text, Expr)]
bindings -> Doc ann
"DoLet" Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann
braces ([Doc ann] -> Doc ann
forall ann. [Doc ann] -> Doc ann
hsep (Doc ann -> [Doc ann] -> [Doc ann]
forall ann. Doc ann -> [Doc ann] -> [Doc ann]
punctuate Doc ann
forall ann. Doc ann
comma [Text -> Doc ann
forall ann. Text -> Doc ann
docText Text
name Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> Doc ann
"=" Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> Expr -> Doc ann
forall ann. Expr -> Doc ann
docExpr Expr
e | (Text
name, Expr
e) <- [(Text, Expr)]
bindings]))
    DoLetDecls SourceSpan
_ [Decl]
decls -> Doc ann
"DoLetDecls" Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann
brackets ([Doc ann] -> Doc ann
forall ann. [Doc ann] -> Doc ann
hsep (Doc ann -> [Doc ann] -> [Doc ann]
forall ann. Doc ann -> [Doc ann] -> [Doc ann]
punctuate Doc ann
forall ann. Doc ann
comma ((Decl -> Doc ann) -> [Decl] -> [Doc ann]
forall a b. (a -> b) -> [a] -> [b]
map Decl -> Doc ann
forall ann. Decl -> Doc ann
docDecl [Decl]
decls)))
    DoExpr SourceSpan
_ Expr
expr -> Doc ann
"DoExpr" Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann
parens (Expr -> Doc ann
forall ann. Expr -> Doc ann
docExpr Expr
expr)

docCompStmt :: CompStmt -> Doc ann
docCompStmt :: forall ann. CompStmt -> Doc ann
docCompStmt CompStmt
stmt =
  case CompStmt
stmt of
    CompGen SourceSpan
_ Pattern
pat Expr
expr -> Doc ann
"CompGen" Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann
parens (Pattern -> Doc ann
forall ann. Pattern -> Doc ann
docPattern Pattern
pat) Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann
parens (Expr -> Doc ann
forall ann. Expr -> Doc ann
docExpr Expr
expr)
    CompGuard SourceSpan
_ Expr
expr -> Doc ann
"CompGuard" Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann
parens (Expr -> Doc ann
forall ann. Expr -> Doc ann
docExpr Expr
expr)
    CompLet SourceSpan
_ [(Text, Expr)]
bindings -> Doc ann
"CompLet" Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann
braces ([Doc ann] -> Doc ann
forall ann. [Doc ann] -> Doc ann
hsep (Doc ann -> [Doc ann] -> [Doc ann]
forall ann. Doc ann -> [Doc ann] -> [Doc ann]
punctuate Doc ann
forall ann. Doc ann
comma [Text -> Doc ann
forall ann. Text -> Doc ann
docText Text
name Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> Doc ann
"=" Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> Expr -> Doc ann
forall ann. Expr -> Doc ann
docExpr Expr
e | (Text
name, Expr
e) <- [(Text, Expr)]
bindings]))
    CompLetDecls SourceSpan
_ [Decl]
decls -> Doc ann
"CompLetDecls" Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann
brackets ([Doc ann] -> Doc ann
forall ann. [Doc ann] -> Doc ann
hsep (Doc ann -> [Doc ann] -> [Doc ann]
forall ann. Doc ann -> [Doc ann] -> [Doc ann]
punctuate Doc ann
forall ann. Doc ann
comma ((Decl -> Doc ann) -> [Decl] -> [Doc ann]
forall a b. (a -> b) -> [a] -> [b]
map Decl -> Doc ann
forall ann. Decl -> Doc ann
docDecl [Decl]
decls)))

docArithSeq :: ArithSeq -> Doc ann
docArithSeq :: forall ann. ArithSeq -> Doc ann
docArithSeq ArithSeq
seqInfo =
  case ArithSeq
seqInfo of
    ArithSeqFrom SourceSpan
_ Expr
from -> Doc ann
"ArithSeqFrom" Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann
parens (Expr -> Doc ann
forall ann. Expr -> Doc ann
docExpr Expr
from)
    ArithSeqFromThen SourceSpan
_ Expr
from Expr
thn -> Doc ann
"ArithSeqFromThen" Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann
parens (Expr -> Doc ann
forall ann. Expr -> Doc ann
docExpr Expr
from) Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann
parens (Expr -> Doc ann
forall ann. Expr -> Doc ann
docExpr Expr
thn)
    ArithSeqFromTo SourceSpan
_ Expr
from Expr
to -> Doc ann
"ArithSeqFromTo" Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann
parens (Expr -> Doc ann
forall ann. Expr -> Doc ann
docExpr Expr
from) Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann
parens (Expr -> Doc ann
forall ann. Expr -> Doc ann
docExpr Expr
to)
    ArithSeqFromThenTo SourceSpan
_ Expr
from Expr
thn Expr
to -> Doc ann
"ArithSeqFromThenTo" Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann
parens (Expr -> Doc ann
forall ann. Expr -> Doc ann
docExpr Expr
from) Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann
parens (Expr -> Doc ann
forall ann. Expr -> Doc ann
docExpr Expr
thn) Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann
parens (Expr -> Doc ann
forall ann. Expr -> Doc ann
docExpr Expr
to)

-- Token pretty printing

docToken :: LexToken -> Doc ann
docToken :: forall ann. LexToken -> Doc ann
docToken LexToken
tok = LexTokenKind -> Doc ann
forall ann. LexTokenKind -> Doc ann
docTokenKind (LexToken -> LexTokenKind
lexTokenKind LexToken
tok)

docTokenKind :: LexTokenKind -> Doc ann
docTokenKind :: forall ann. LexTokenKind -> Doc ann
docTokenKind LexTokenKind
kind =
  case LexTokenKind
kind of
    LexTokenKind
TkKeywordCase -> Doc ann
"TkKeywordCase"
    LexTokenKind
TkKeywordClass -> Doc ann
"TkKeywordClass"
    LexTokenKind
TkKeywordData -> Doc ann
"TkKeywordData"
    LexTokenKind
TkKeywordDefault -> Doc ann
"TkKeywordDefault"
    LexTokenKind
TkKeywordDeriving -> Doc ann
"TkKeywordDeriving"
    LexTokenKind
TkKeywordDo -> Doc ann
"TkKeywordDo"
    LexTokenKind
TkKeywordElse -> Doc ann
"TkKeywordElse"
    LexTokenKind
TkKeywordForeign -> Doc ann
"TkKeywordForeign"
    LexTokenKind
TkKeywordIf -> Doc ann
"TkKeywordIf"
    LexTokenKind
TkKeywordImport -> Doc ann
"TkKeywordImport"
    LexTokenKind
TkKeywordIn -> Doc ann
"TkKeywordIn"
    LexTokenKind
TkKeywordInfix -> Doc ann
"TkKeywordInfix"
    LexTokenKind
TkKeywordInfixl -> Doc ann
"TkKeywordInfixl"
    LexTokenKind
TkKeywordInfixr -> Doc ann
"TkKeywordInfixr"
    LexTokenKind
TkKeywordInstance -> Doc ann
"TkKeywordInstance"
    LexTokenKind
TkKeywordLet -> Doc ann
"TkKeywordLet"
    LexTokenKind
TkKeywordModule -> Doc ann
"TkKeywordModule"
    LexTokenKind
TkKeywordNewtype -> Doc ann
"TkKeywordNewtype"
    LexTokenKind
TkKeywordOf -> Doc ann
"TkKeywordOf"
    LexTokenKind
TkKeywordThen -> Doc ann
"TkKeywordThen"
    LexTokenKind
TkKeywordType -> Doc ann
"TkKeywordType"
    LexTokenKind
TkKeywordWhere -> Doc ann
"TkKeywordWhere"
    LexTokenKind
TkKeywordUnderscore -> Doc ann
"TkKeywordUnderscore"
    LexTokenKind
TkKeywordQualified -> Doc ann
"TkKeywordQualified"
    LexTokenKind
TkKeywordAs -> Doc ann
"TkKeywordAs"
    LexTokenKind
TkKeywordHiding -> Doc ann
"TkKeywordHiding"
    LexTokenKind
TkReservedDotDot -> Doc ann
"TkReservedDotDot"
    LexTokenKind
TkReservedColon -> Doc ann
"TkReservedColon"
    LexTokenKind
TkReservedDoubleColon -> Doc ann
"TkReservedDoubleColon"
    LexTokenKind
TkReservedEquals -> Doc ann
"TkReservedEquals"
    LexTokenKind
TkReservedBackslash -> Doc ann
"TkReservedBackslash"
    LexTokenKind
TkReservedPipe -> Doc ann
"TkReservedPipe"
    LexTokenKind
TkReservedLeftArrow -> Doc ann
"TkReservedLeftArrow"
    LexTokenKind
TkReservedRightArrow -> Doc ann
"TkReservedRightArrow"
    LexTokenKind
TkReservedAt -> Doc ann
"TkReservedAt"
    LexTokenKind
TkReservedDoubleArrow -> Doc ann
"TkReservedDoubleArrow"
    TkVarId Text
name -> Doc ann
"TkVarId" Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> Text -> Doc ann
forall ann. Text -> Doc ann
docText Text
name
    TkConId Text
name -> Doc ann
"TkConId" Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> Text -> Doc ann
forall ann. Text -> Doc ann
docText Text
name
    TkQVarId Text
name -> Doc ann
"TkQVarId" Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> Text -> Doc ann
forall ann. Text -> Doc ann
docText Text
name
    TkQConId Text
name -> Doc ann
"TkQConId" Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> Text -> Doc ann
forall ann. Text -> Doc ann
docText Text
name
    TkVarSym Text
name -> Doc ann
"TkVarSym" Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> Text -> Doc ann
forall ann. Text -> Doc ann
docText Text
name
    TkConSym Text
name -> Doc ann
"TkConSym" Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> Text -> Doc ann
forall ann. Text -> Doc ann
docText Text
name
    TkQVarSym Text
name -> Doc ann
"TkQVarSym" Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> Text -> Doc ann
forall ann. Text -> Doc ann
docText Text
name
    TkQConSym Text
name -> Doc ann
"TkQConSym" Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> Text -> Doc ann
forall ann. Text -> Doc ann
docText Text
name
    TkInteger Integer
n -> Doc ann
"TkInteger" Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> Integer -> Doc ann
forall ann. Integer -> Doc ann
forall a ann. Pretty a => a -> Doc ann
pretty Integer
n
    TkIntegerBase Integer
n Text
repr -> Doc ann
"TkIntegerBase" Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> Integer -> Doc ann
forall ann. Integer -> Doc ann
forall a ann. Pretty a => a -> Doc ann
pretty Integer
n Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> Text -> Doc ann
forall ann. Text -> Doc ann
docText Text
repr
    TkFloat Double
n Text
repr -> Doc ann
"TkFloat" Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> Double -> Doc ann
forall ann. Double -> Doc ann
forall a ann. Pretty a => a -> Doc ann
pretty Double
n Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> Text -> Doc ann
forall ann. Text -> Doc ann
docText Text
repr
    TkChar Char
c -> Doc ann
"TkChar" Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> String -> Doc ann
forall ann. String -> Doc ann
forall a ann. Pretty a => a -> Doc ann
pretty (Char -> String
forall a. Show a => a -> String
show Char
c)
    TkString Text
s -> Doc ann
"TkString" Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> Text -> Doc ann
forall ann. Text -> Doc ann
docText Text
s
    LexTokenKind
TkSpecialLParen -> Doc ann
"TkSpecialLParen"
    LexTokenKind
TkSpecialRParen -> Doc ann
"TkSpecialRParen"
    LexTokenKind
TkSpecialComma -> Doc ann
"TkSpecialComma"
    LexTokenKind
TkSpecialSemicolon -> Doc ann
"TkSpecialSemicolon"
    LexTokenKind
TkSpecialLBracket -> Doc ann
"TkSpecialLBracket"
    LexTokenKind
TkSpecialRBracket -> Doc ann
"TkSpecialRBracket"
    LexTokenKind
TkSpecialBacktick -> Doc ann
"TkSpecialBacktick"
    LexTokenKind
TkSpecialLBrace -> Doc ann
"TkSpecialLBrace"
    LexTokenKind
TkSpecialRBrace -> Doc ann
"TkSpecialRBrace"
    LexTokenKind
TkMinusOperator -> Doc ann
"TkMinusOperator"
    LexTokenKind
TkPrefixMinus -> Doc ann
"TkPrefixMinus"
    LexTokenKind
TkPrefixBang -> Doc ann
"TkPrefixBang"
    LexTokenKind
TkPrefixTilde -> Doc ann
"TkPrefixTilde"
    TkPragmaLanguage [ExtensionSetting]
settings -> Doc ann
"TkPragmaLanguage" Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann
brackets ([Doc ann] -> Doc ann
forall ann. [Doc ann] -> Doc ann
hsep (Doc ann -> [Doc ann] -> [Doc ann]
forall ann. Doc ann -> [Doc ann] -> [Doc ann]
punctuate Doc ann
forall ann. Doc ann
comma ((ExtensionSetting -> Doc ann) -> [ExtensionSetting] -> [Doc ann]
forall a b. (a -> b) -> [a] -> [b]
map ExtensionSetting -> Doc ann
forall ann. ExtensionSetting -> Doc ann
docExtensionSetting [ExtensionSetting]
settings)))
    TkPragmaWarning Text
msg -> Doc ann
"TkPragmaWarning" Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> Text -> Doc ann
forall ann. Text -> Doc ann
docText Text
msg
    TkPragmaDeprecated Text
msg -> Doc ann
"TkPragmaDeprecated" Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> Text -> Doc ann
forall ann. Text -> Doc ann
docText Text
msg
    TkQuasiQuote Text
quoter Text
body -> Doc ann
"TkQuasiQuote" Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> Text -> Doc ann
forall ann. Text -> Doc ann
docText Text
quoter Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> Text -> Doc ann
forall ann. Text -> Doc ann
docText Text
body
    TkError Text
msg -> Doc ann
"TkError" Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> Text -> Doc ann
forall ann. Text -> Doc ann
docText Text
msg

-- Helpers

field :: Text -> Doc ann -> Doc ann
field :: forall ann. Text -> Doc ann -> Doc ann
field Text
name Doc ann
val = Text -> Doc ann
forall a ann. Pretty a => a -> Doc ann
forall ann. Text -> Doc ann
pretty Text
name Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> Doc ann
"=" Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> Doc ann
val

optionalField :: Text -> (a -> Doc ann) -> Maybe a -> [Doc ann]
optionalField :: forall a ann. Text -> (a -> Doc ann) -> Maybe a -> [Doc ann]
optionalField Text
name a -> Doc ann
f Maybe a
mVal =
  case Maybe a
mVal of
    Just a
val -> [Text -> Doc ann -> Doc ann
forall ann. Text -> Doc ann -> Doc ann
field Text
name (a -> Doc ann
f a
val)]
    Maybe a
Nothing -> []

optionalField' :: (a -> Doc ann) -> Maybe a -> Doc ann
optionalField' :: forall a ann. (a -> Doc ann) -> Maybe a -> Doc ann
optionalField' a -> Doc ann
f Maybe a
mVal =
  case Maybe a
mVal of
    Just a
val -> Doc ann
" " Doc ann -> Doc ann -> Doc ann
forall a. Semigroup a => a -> a -> a
<> a -> Doc ann
f a
val
    Maybe a
Nothing -> Doc ann
""

listField :: Text -> (a -> Doc ann) -> [a] -> [Doc ann]
listField :: forall a ann. Text -> (a -> Doc ann) -> [a] -> [Doc ann]
listField Text
_ a -> Doc ann
_ [] = []
listField Text
name a -> Doc ann
f [a]
xs = [Text -> Doc ann -> Doc ann
forall ann. Text -> Doc ann -> Doc ann
field Text
name (Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann
brackets ([Doc ann] -> Doc ann
forall ann. [Doc ann] -> Doc ann
hsep (Doc ann -> [Doc ann] -> [Doc ann]
forall ann. Doc ann -> [Doc ann] -> [Doc ann]
punctuate Doc ann
forall ann. Doc ann
comma ((a -> Doc ann) -> [a] -> [Doc ann]
forall a b. (a -> b) -> [a] -> [b]
map a -> Doc ann
f [a]
xs))))]

boolField :: Text -> Bool -> [Doc ann]
boolField :: forall ann. Text -> Bool -> [Doc ann]
boolField Text
_ Bool
False = []
boolField Text
name Bool
True = [Text -> Doc ann -> Doc ann
forall ann. Text -> Doc ann -> Doc ann
field Text
name Doc ann
"True"]

docText :: Text -> Doc ann
docText :: forall ann. Text -> Doc ann
docText Text
t = Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann
dquotes (Text -> Doc ann
forall a ann. Pretty a => a -> Doc ann
forall ann. Text -> Doc ann
pretty Text
t)

docTextList :: [Text] -> Doc ann
docTextList :: forall ann. [Text] -> Doc ann
docTextList [Text]
ts = Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann
brackets ([Doc ann] -> Doc ann
forall ann. [Doc ann] -> Doc ann
hsep (Doc ann -> [Doc ann] -> [Doc ann]
forall ann. Doc ann -> [Doc ann] -> [Doc ann]
punctuate Doc ann
forall ann. Doc ann
comma ((Text -> Doc ann) -> [Text] -> [Doc ann]
forall a b. (a -> b) -> [a] -> [b]
map Text -> Doc ann
forall ann. Text -> Doc ann
docText [Text]
ts)))