-- Copyright 2019 Google LLC
--
-- Use of this source code is governed by a BSD-style
-- license that can be found in the LICENSE file or at
-- https://developers.google.com/open-source/licenses/bsd

{-# LANGUAGE CPP #-}
{-# LANGUAGE TypeFamilies #-}

-- | This module provides combinators for constructing Haskell declarations.
module GHC.SourceGen.Decl
    ( HsDecl'
      -- * Type declarations
    , type'
    , newtype'
    , data'
      -- ** Data constructors
    , ConDecl'
    , prefixCon
    , infixCon
    , recordCon
    , Field
    , field
    , strict
    , lazy
      -- ** Deriving clauses
    , HsDerivingClause'
    , deriving'
    , derivingStock
    , derivingAnyclass
    , derivingNewtype
#if MIN_VERSION_ghc(8,6,0)
    , derivingVia
#endif
    , standaloneDeriving
    , standaloneDerivingStock
    , standaloneDerivingNewtype
    , standaloneDerivingAnyclass
      -- * Class declarations
    , class'
    , ClassDecl
    , funDep
      -- * Instance declarations
    , instance'
    , RawInstDecl
    , HasTyFamInst(..)
    , tyFamInst
      -- * Pattern synonyms
    , patSynSigs
    , patSynSig
    , patSynBind
    ) where

#if MIN_VERSION_ghc(9,0,0)
import GHC (LexicalFixity(Prefix))
import GHC.Data.Bag (listToBag)

#if MIN_VERSION_ghc(9,6,0)
import GHC (GhcPs, LayoutInfo (NoLayoutInfo))
#else
import GHC.Types.SrcLoc (LayoutInfo(NoLayoutInfo))
#endif

#else
import BasicTypes (LexicalFixity(Prefix))
import Bag (listToBag)
#endif
#if !MIN_VERSION_ghc(8,6,0)
import BasicTypes (DerivStrategy(..))
#endif
import GHC.Hs.Binds
import GHC.Hs.Decls

import GHC.Hs.Type
    ( ConDeclField(..)
    , FieldOcc(..)
    , HsConDetails(..)
#if !MIN_VERSION_ghc(9,2,0)
    , HsImplicitBndrs (..)
#endif
#if MIN_VERSION_ghc(9,2,0)
    , HsOuterTyVarBndrs (..)
#endif
    , HsSrcBang(..)
    , HsType(..)
    , LHsType
#if MIN_VERSION_ghc(8,6,0)
    , HsWildCardBndrs (..)
#endif
#if MIN_VERSION_ghc(8,8,0)
    , HsArg(..)
#endif
    , SrcStrictness(..)
    , SrcUnpackedness(..)
#if MIN_VERSION_ghc(9,0,0)
    , hsUnrestricted
#endif
    )

#if MIN_VERSION_ghc(9,2,0)
import GHC.Parser.Annotation (AnnSortKey(..), EpAnn(..))
#elif MIN_VERSION_ghc(8,10,0)
import GHC.Hs.Extension (NoExtField(NoExtField))
#elif MIN_VERSION_ghc(8,6,0)
import GHC.Hs.Extension (NoExt(NoExt))
#else
import PlaceHolder (PlaceHolder(..))
#endif

import GHC.SourceGen.Binds.Internal
import GHC.SourceGen.Lit.Internal (noSourceText)
import GHC.SourceGen.Name
import GHC.SourceGen.Name.Internal
import GHC.SourceGen.Syntax.Internal
import GHC.SourceGen.Type.Internal
import GHC.Hs

-- | A definition that can appear in the body of a @class@ declaration.
--
-- 'ClassDecl' definitions may be constructed using 'funDep' or using the
-- instance of 'HasValBind'.  For more details, see the documentation of
-- that function, and of "GHC.SourceGen.Binds" overall.
data ClassDecl
    = ClassSig Sig'
    | ClassDefaultMethod HsBind'
    | ClassFunDep [RdrNameStr] [RdrNameStr]
    -- TODO: type families

instance HasValBind ClassDecl where
    sigB :: Sig' -> ClassDecl
sigB = Sig' -> ClassDecl
ClassSig
    bindB :: HsBind' -> ClassDecl
bindB = HsBind' -> ClassDecl
ClassDefaultMethod

-- | A functional dependency for a class.
--
-- > | a, b -> c
-- > =====
-- > funDep ["a", "b"] ["c"]
--
-- > class Ident a b | a -> b, b -> a where
-- >   ident :: a -> b
-- > =====
-- > class' [] "Ident" ["a", "b"]
-- >    [ funDep ["a"] ["b"]
-- >    , funDep ["b"] ["a"]
-- >    , typeSig "ident" $ var "a" --> var "b"
-- >    ]
funDep :: [RdrNameStr] -> [RdrNameStr] -> ClassDecl
funDep :: [RdrNameStr] -> [RdrNameStr] -> ClassDecl
funDep = [RdrNameStr] -> [RdrNameStr] -> ClassDecl
ClassFunDep

-- TODO:
-- - kinded variables
-- - fixity of declaration
-- - functional dependencies
-- - associated types

-- | A class declaration.
--
-- > class (Real a, Enum a) => Integral a where
-- >   divMod :: a -> a -> (a, a)
-- >   div :: a -> a -> a
-- >   div x y = fst (divMod x y)
-- > =====
-- > let a = var "a"
-- > in class'
-- >      [var "Real" @@ a, var "Enum" @@ a]
-- >      "Integral"
-- >      [bvar "a"]
-- >      [ typeSig "divMod" $ a --> a --> tuple [a, a]
-- >      , typeSig "div" $ a --> a --> a
-- >      , funBind "div"
-- >          $ match [bvar "x", bvar "y"]
-- >             $ var "fst" @@ (var "divMod" @@ var "x" @@ var "y")
-- >      ]
class'
    :: [HsType'] -- ^ Context
    -> OccNameStr -- ^ Class name
    -> [HsTyVarBndr'] -- ^ Type parameters
    -> [ClassDecl] -- ^ Class declarations
    -> HsDecl'
class' :: [HsType'] -> OccNameStr -> [HsTyVarBndr'] -> [ClassDecl] -> HsDecl'
class' [HsType']
context OccNameStr
name [HsTyVarBndr']
vars [ClassDecl]
decls
    = (NoExtField -> TyClDecl GhcPs -> HsDecl')
-> TyClDecl GhcPs -> HsDecl'
forall a. (NoExtField -> a) -> a
noExt XTyClD GhcPs -> TyClDecl GhcPs -> HsDecl'
NoExtField -> TyClDecl GhcPs -> HsDecl'
forall p. XTyClD p -> TyClDecl p -> HsDecl p
TyClD (TyClDecl GhcPs -> HsDecl') -> TyClDecl GhcPs -> HsDecl'
forall a b. (a -> b) -> a -> b
$ ClassDecl
            { tcdCtxt :: Maybe (LHsContext GhcPs)
tcdCtxt = LHsContext GhcPs -> Maybe (LHsContext GhcPs)
forall {a}. a -> Maybe a
toHsContext (LHsContext GhcPs -> Maybe (LHsContext GhcPs))
-> LHsContext GhcPs -> Maybe (LHsContext GhcPs)
forall a b. (a -> b) -> a -> b
$ [GenLocated (SrcSpanAnn AnnListItem) HsType']
-> GenLocated
     (SrcSpanAnn AnnContext)
     [GenLocated (SrcSpanAnn AnnListItem) HsType']
forall a ann. a -> GenLocated (SrcSpanAnn ann) a
mkLocated ([GenLocated (SrcSpanAnn AnnListItem) HsType']
 -> GenLocated
      (SrcSpanAnn AnnContext)
      [GenLocated (SrcSpanAnn AnnListItem) HsType'])
-> [GenLocated (SrcSpanAnn AnnListItem) HsType']
-> GenLocated
     (SrcSpanAnn AnnContext)
     [GenLocated (SrcSpanAnn AnnListItem) HsType']
forall a b. (a -> b) -> a -> b
$ (HsType' -> GenLocated (SrcSpanAnn AnnListItem) HsType')
-> [HsType'] -> [GenLocated (SrcSpanAnn AnnListItem) HsType']
forall a b. (a -> b) -> [a] -> [b]
map HsType' -> GenLocated (SrcSpanAnn AnnListItem) HsType'
forall a ann. a -> GenLocated (SrcSpanAnn ann) a
mkLocated [HsType']
context
#if MIN_VERSION_ghc(9,6,0)
            , tcdLayout :: LayoutInfo GhcPs
tcdLayout = LayoutInfo GhcPs
forall pass. LayoutInfo pass
NoLayoutInfo
            , tcdCExt :: XClassDecl GhcPs
tcdCExt = (EpAnn [AddEpAnn]
forall ann. EpAnn ann
EpAnnNotUsed, AnnSortKey
NoAnnSortKey)
#elif MIN_VERSION_ghc(9,2,0)
            , tcdCExt = (EpAnnNotUsed, NoAnnSortKey, NoLayoutInfo)
#elif MIN_VERSION_ghc(9,0,0)
            , tcdCExt = NoLayoutInfo
#elif MIN_VERSION_ghc(8,10,0)
            , tcdCExt = NoExtField
#elif MIN_VERSION_ghc(8,6,0)
            , tcdCExt = NoExt
#else
            , tcdFVs = PlaceHolder
#endif
            , tcdLName :: LIdP GhcPs
tcdLName = RdrNameStr -> LocatedN RdrName
typeRdrName (RdrNameStr -> LocatedN RdrName) -> RdrNameStr -> LocatedN RdrName
forall a b. (a -> b) -> a -> b
$ OccNameStr -> RdrNameStr
unqual OccNameStr
name
            , tcdTyVars :: LHsQTyVars GhcPs
tcdTyVars = [HsTyVarBndr'] -> LHsQTyVars GhcPs
mkQTyVars [HsTyVarBndr']
vars
            , tcdFixity :: LexicalFixity
tcdFixity = LexicalFixity
Prefix
            , tcdFDs :: [LHsFunDep GhcPs]
tcdFDs = [ FunDep GhcPs -> GenLocated (SrcSpanAnn AnnListItem) (FunDep GhcPs)
forall a ann. a -> GenLocated (SrcSpanAnn ann) a
mkLocated (FunDep GhcPs
 -> GenLocated (SrcSpanAnn AnnListItem) (FunDep GhcPs))
-> FunDep GhcPs
-> GenLocated (SrcSpanAnn AnnListItem) (FunDep GhcPs)
forall a b. (a -> b) -> a -> b
$ [LIdP GhcPs] -> [LIdP GhcPs] -> FunDep GhcPs
funDep' ((RdrNameStr -> LocatedN RdrName)
-> [RdrNameStr] -> [LocatedN RdrName]
forall a b. (a -> b) -> [a] -> [b]
map RdrNameStr -> LocatedN RdrName
typeRdrName [RdrNameStr]
xs) ((RdrNameStr -> LocatedN RdrName)
-> [RdrNameStr] -> [LocatedN RdrName]
forall a b. (a -> b) -> [a] -> [b]
map RdrNameStr -> LocatedN RdrName
typeRdrName [RdrNameStr]
ys)
                       | ClassFunDep [RdrNameStr]
xs [RdrNameStr]
ys <- [ClassDecl]
decls
                       ]
            , tcdSigs :: [LSig GhcPs]
tcdSigs = [Sig' -> GenLocated (SrcSpanAnn AnnListItem) Sig'
forall a ann. a -> GenLocated (SrcSpanAnn ann) a
mkLocated Sig'
sig | ClassSig Sig'
sig <- [ClassDecl]
decls]
            , tcdMeths :: LHsBinds GhcPs
tcdMeths =
                [GenLocated (SrcSpanAnn AnnListItem) HsBind']
-> Bag (GenLocated (SrcSpanAnn AnnListItem) HsBind')
forall a. [a] -> Bag a
listToBag [HsBind' -> GenLocated (SrcSpanAnn AnnListItem) HsBind'
forall a ann. a -> GenLocated (SrcSpanAnn ann) a
mkLocated HsBind'
bind | ClassDefaultMethod HsBind'
bind <- [ClassDecl]
decls]
            , tcdATs :: [LFamilyDecl GhcPs]
tcdATs = []  -- Associated types
            , tcdATDefs :: [LTyFamDefltDecl GhcPs]
tcdATDefs = []  -- Associated type defaults
            , tcdDocs :: [LDocDecl GhcPs]
tcdDocs = []  -- Haddocks
            }
  where
#if MIN_VERSION_ghc(9,2,0)
    funDep' :: [LIdP GhcPs] -> [LIdP GhcPs] -> FunDep GhcPs
funDep' = (EpAnn [AddEpAnn] -> [LIdP GhcPs] -> [LIdP GhcPs] -> FunDep GhcPs)
-> [LIdP GhcPs] -> [LIdP GhcPs] -> FunDep GhcPs
forall ann a. (EpAnn ann -> a) -> a
withEpAnnNotUsed XCFunDep GhcPs -> [LIdP GhcPs] -> [LIdP GhcPs] -> FunDep GhcPs
EpAnn [AddEpAnn] -> [LIdP GhcPs] -> [LIdP GhcPs] -> FunDep GhcPs
forall pass.
XCFunDep pass -> [LIdP pass] -> [LIdP pass] -> FunDep pass
FunDep
#else
    funDep' = (,)
#endif
#if MIN_VERSION_ghc(9,2,0)
    toHsContext :: a -> Maybe a
toHsContext = a -> Maybe a
forall {a}. a -> Maybe a
Just
#else
    toHsContext = id
#endif

-- | A definition that can appear in the body of an @instance@ declaration.
--
-- 'RawInstDecl' definitions may be constructed using its class instances, e.g.,
-- 'HasValBind'.  For more details, see the documentation of those classes.
data RawInstDecl
    = InstSig Sig'
    | InstBind HsBind'
    | InstTyFam TyFamInstDecl'

instance HasValBind RawInstDecl where
    sigB :: Sig' -> RawInstDecl
sigB = Sig' -> RawInstDecl
InstSig
    bindB :: HsBind' -> RawInstDecl
bindB = HsBind' -> RawInstDecl
InstBind

-- | An instance declaration.
--
-- > instance Show Bool where
-- >   show :: Bool -> String -- Requires the InstanceSigs extension
-- >   show True = "True"
-- >   show False = "False"
-- > =====
-- > instance' (var "Show" @@ var "Bool")
-- >   [ typeSig "show" $ var "Bool" --> var "String"
-- >   , funBinds "show"
-- >       [ match [bvar "True"] $ string "True"
-- >       , match [bvar "False"] $ string "False"
-- >       ]
-- >   ]
instance' :: HsType' -> [RawInstDecl] -> HsDecl'
instance' :: HsType' -> [RawInstDecl] -> HsDecl'
instance' HsType'
ty [RawInstDecl]
decls = (NoExtField -> InstDecl GhcPs -> HsDecl')
-> InstDecl GhcPs -> HsDecl'
forall a. (NoExtField -> a) -> a
noExt XInstD GhcPs -> InstDecl GhcPs -> HsDecl'
NoExtField -> InstDecl GhcPs -> HsDecl'
forall p. XInstD p -> InstDecl p -> HsDecl p
InstD  (InstDecl GhcPs -> HsDecl') -> InstDecl GhcPs -> HsDecl'
forall a b. (a -> b) -> a -> b
$ (NoExtField -> ClsInstDecl GhcPs -> InstDecl GhcPs)
-> ClsInstDecl GhcPs -> InstDecl GhcPs
forall a. (NoExtField -> a) -> a
noExt XClsInstD GhcPs -> ClsInstDecl GhcPs -> InstDecl GhcPs
NoExtField -> ClsInstDecl GhcPs -> InstDecl GhcPs
forall pass. XClsInstD pass -> ClsInstDecl pass -> InstDecl pass
ClsInstD (ClsInstDecl GhcPs -> InstDecl GhcPs)
-> ClsInstDecl GhcPs -> InstDecl GhcPs
forall a b. (a -> b) -> a -> b
$ ClsInstDecl
    { cid_poly_ty :: LHsSigType GhcPs
cid_poly_ty = HsType' -> LHsSigType GhcPs
sigType HsType'
ty
#if MIN_VERSION_ghc(9,2,0)
    , cid_ext :: XCClsInstDecl GhcPs
cid_ext = (EpAnn [AddEpAnn]
forall ann. EpAnn ann
EpAnnNotUsed, AnnSortKey
NoAnnSortKey)
#elif MIN_VERSION_ghc(8,10,0)
    , cid_ext = NoExtField
#elif MIN_VERSION_ghc(8,6,0)
    , cid_ext = NoExt
#endif
    , cid_binds :: LHsBinds GhcPs
cid_binds = [GenLocated (SrcSpanAnn AnnListItem) HsBind']
-> Bag (GenLocated (SrcSpanAnn AnnListItem) HsBind')
forall a. [a] -> Bag a
listToBag [HsBind' -> GenLocated (SrcSpanAnn AnnListItem) HsBind'
forall a ann. a -> GenLocated (SrcSpanAnn ann) a
mkLocated HsBind'
b | InstBind HsBind'
b <- [RawInstDecl]
decls]
    , cid_sigs :: [LSig GhcPs]
cid_sigs = [Sig' -> GenLocated (SrcSpanAnn AnnListItem) Sig'
forall a ann. a -> GenLocated (SrcSpanAnn ann) a
mkLocated Sig'
sig | InstSig Sig'
sig <- [RawInstDecl]
decls]
    , cid_tyfam_insts :: [LTyFamDefltDecl GhcPs]
cid_tyfam_insts = [TyFamInstDecl GhcPs
-> GenLocated (SrcSpanAnn AnnListItem) (TyFamInstDecl GhcPs)
forall a ann. a -> GenLocated (SrcSpanAnn ann) a
mkLocated (TyFamInstDecl GhcPs
 -> GenLocated (SrcSpanAnn AnnListItem) (TyFamInstDecl GhcPs))
-> TyFamInstDecl GhcPs
-> GenLocated (SrcSpanAnn AnnListItem) (TyFamInstDecl GhcPs)
forall a b. (a -> b) -> a -> b
$ TyFamInstDecl GhcPs
t | InstTyFam TyFamInstDecl GhcPs
t <- [RawInstDecl]
decls]
    , cid_datafam_insts :: [LDataFamInstDecl GhcPs]
cid_datafam_insts = []
    , cid_overlap_mode :: Maybe (XRec GhcPs OverlapMode)
cid_overlap_mode = Maybe (XRec GhcPs OverlapMode)
Maybe (GenLocated SrcSpanAnnP OverlapMode)
forall a. Maybe a
Nothing
    }

-- | Terms which can contain a type instance declaration.
--
-- To use this class, call 'tyFamInst'.
class HasTyFamInst t where
    tyFamInstD :: TyFamInstDecl' -> t

instance HasTyFamInst HsDecl' where
    tyFamInstD :: TyFamInstDecl GhcPs -> HsDecl'
tyFamInstD = (NoExtField -> InstDecl GhcPs -> HsDecl')
-> InstDecl GhcPs -> HsDecl'
forall a. (NoExtField -> a) -> a
noExt XInstD GhcPs -> InstDecl GhcPs -> HsDecl'
NoExtField -> InstDecl GhcPs -> HsDecl'
forall p. XInstD p -> InstDecl p -> HsDecl p
InstD (InstDecl GhcPs -> HsDecl')
-> (TyFamInstDecl GhcPs -> InstDecl GhcPs)
-> TyFamInstDecl GhcPs
-> HsDecl'
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (NoExtField -> TyFamInstDecl GhcPs -> InstDecl GhcPs)
-> TyFamInstDecl GhcPs -> InstDecl GhcPs
forall a. (NoExtField -> a) -> a
noExt XTyFamInstD GhcPs -> TyFamInstDecl GhcPs -> InstDecl GhcPs
NoExtField -> TyFamInstDecl GhcPs -> InstDecl GhcPs
forall pass.
XTyFamInstD pass -> TyFamInstDecl pass -> InstDecl pass
TyFamInstD

instance HasTyFamInst RawInstDecl where
    tyFamInstD :: TyFamInstDecl GhcPs -> RawInstDecl
tyFamInstD = TyFamInstDecl GhcPs -> RawInstDecl
InstTyFam

-- | A type family instance.
--
-- > type Elt String = Char
-- > =====
-- > tyFamInst "Elt" [var "String"] (var "Char")
tyFamInst :: HasTyFamInst t => RdrNameStr -> [HsType'] -> HsType' -> t
tyFamInst :: forall t. HasTyFamInst t => RdrNameStr -> [HsType'] -> HsType' -> t
tyFamInst RdrNameStr
name [HsType']
params HsType'
ty = TyFamInstDecl GhcPs -> t
forall t. HasTyFamInst t => TyFamInstDecl GhcPs -> t
tyFamInstD
        (TyFamInstDecl GhcPs -> t) -> TyFamInstDecl GhcPs -> t
forall a b. (a -> b) -> a -> b
$ FamEqn GhcPs (XRec GhcPs HsType') -> TyFamInstDecl GhcPs
tyFamInstDecl
        (FamEqn GhcPs (XRec GhcPs HsType') -> TyFamInstDecl GhcPs)
-> FamEqn GhcPs (XRec GhcPs HsType') -> TyFamInstDecl GhcPs
forall a b. (a -> b) -> a -> b
$ LIdP GhcPs
-> HsOuterFamEqnTyVarBndrs GhcPs
-> [XRec GhcPs HsType']
-> LexicalFixity
-> GenLocated (SrcSpanAnn AnnListItem) HsType'
-> FamEqn GhcPs (GenLocated (SrcSpanAnn AnnListItem) HsType')
forall {pass} {rhs} {ann}.
(XCFamEqn pass rhs ~ EpAnn ann) =>
XRec pass (IdP pass)
-> HsOuterFamEqnTyVarBndrs pass
-> [XRec pass (HsType pass)]
-> LexicalFixity
-> rhs
-> FamEqn pass rhs
famEqn
            (RdrNameStr -> LocatedN RdrName
typeRdrName RdrNameStr
name)
            HsOuterFamEqnTyVarBndrs GhcPs
forall {flag}. HsOuterTyVarBndrs flag GhcPs
eqn_bndrs
            ((HsType' -> GenLocated (SrcSpanAnn AnnListItem) HsType')
-> [HsType'] -> [GenLocated (SrcSpanAnn AnnListItem) HsType']
forall a b. (a -> b) -> [a] -> [b]
map HsType' -> GenLocated (SrcSpanAnn AnnListItem) HsType'
forall a ann. a -> GenLocated (SrcSpanAnn ann) a
mkLocated [HsType']
params)
            LexicalFixity
Prefix
            (HsType' -> GenLocated (SrcSpanAnn AnnListItem) HsType'
forall a ann. a -> GenLocated (SrcSpanAnn ann) a
mkLocated HsType'
ty)
  where
#if MIN_VERSION_ghc(9,2,0)
    tyFamInstDecl :: FamEqn GhcPs (XRec GhcPs HsType') -> TyFamInstDecl GhcPs
tyFamInstDecl = (EpAnn [AddEpAnn]
 -> FamEqn GhcPs (XRec GhcPs HsType') -> TyFamInstDecl GhcPs)
-> FamEqn GhcPs (XRec GhcPs HsType') -> TyFamInstDecl GhcPs
forall ann a. (EpAnn ann -> a) -> a
withEpAnnNotUsed XCTyFamInstDecl GhcPs
-> FamEqn GhcPs (XRec GhcPs HsType') -> TyFamInstDecl GhcPs
EpAnn [AddEpAnn]
-> FamEqn GhcPs (XRec GhcPs HsType') -> TyFamInstDecl GhcPs
forall pass.
XCTyFamInstDecl pass -> TyFamInstEqn pass -> TyFamInstDecl pass
TyFamInstDecl
#else
    tyFamInstDecl = TyFamInstDecl . withPlaceHolder . noExt (withPlaceHolder HsIB)
#endif
#if MIN_VERSION_ghc(9,2,0)
    famEqn :: XRec pass (IdP pass)
-> HsOuterFamEqnTyVarBndrs pass
-> [XRec pass (HsType pass)]
-> LexicalFixity
-> rhs
-> FamEqn pass rhs
famEqn XRec pass (IdP pass)
tycon HsOuterFamEqnTyVarBndrs pass
bndrs [XRec pass (HsType pass)]
pats = (EpAnn ann
 -> XRec pass (IdP pass)
 -> HsOuterFamEqnTyVarBndrs pass
 -> [HsArg (XRec pass (HsType pass)) (XRec pass (HsType pass))]
 -> LexicalFixity
 -> rhs
 -> FamEqn pass rhs)
-> XRec pass (IdP pass)
-> HsOuterFamEqnTyVarBndrs pass
-> [HsArg (XRec pass (HsType pass)) (XRec pass (HsType pass))]
-> LexicalFixity
-> rhs
-> FamEqn pass rhs
forall ann a. (EpAnn ann -> a) -> a
withEpAnnNotUsed XCFamEqn pass rhs
-> XRec pass (IdP pass)
-> HsOuterFamEqnTyVarBndrs pass
-> [HsArg (XRec pass (HsType pass)) (XRec pass (HsType pass))]
-> LexicalFixity
-> rhs
-> FamEqn pass rhs
EpAnn ann
-> XRec pass (IdP pass)
-> HsOuterFamEqnTyVarBndrs pass
-> [HsArg (XRec pass (HsType pass)) (XRec pass (HsType pass))]
-> LexicalFixity
-> rhs
-> FamEqn pass rhs
forall pass rhs.
XCFamEqn pass rhs
-> LIdP pass
-> HsOuterFamEqnTyVarBndrs pass
-> HsTyPats pass
-> LexicalFixity
-> rhs
-> FamEqn pass rhs
FamEqn XRec pass (IdP pass)
tycon HsOuterFamEqnTyVarBndrs pass
bndrs ((XRec pass (HsType pass)
 -> HsArg (XRec pass (HsType pass)) (XRec pass (HsType pass)))
-> [XRec pass (HsType pass)]
-> [HsArg (XRec pass (HsType pass)) (XRec pass (HsType pass))]
forall a b. (a -> b) -> [a] -> [b]
map XRec pass (HsType pass)
-> HsArg (XRec pass (HsType pass)) (XRec pass (HsType pass))
forall tm ty. tm -> HsArg tm ty
HsValArg [XRec pass (HsType pass)]
pats)
#elif MIN_VERSION_ghc(8,8,0)
    famEqn tycon bndrs pats = noExt FamEqn tycon bndrs (map HsValArg pats)
#else
    famEqn tycon _ = noExt FamEqn tycon
#endif
#if MIN_VERSION_ghc(9,2,0)
    eqn_bndrs :: HsOuterTyVarBndrs flag GhcPs
eqn_bndrs = (NoExtField -> HsOuterTyVarBndrs flag GhcPs)
-> HsOuterTyVarBndrs flag GhcPs
forall a. (NoExtField -> a) -> a
noExt XHsOuterImplicit GhcPs -> HsOuterTyVarBndrs flag GhcPs
NoExtField -> HsOuterTyVarBndrs flag GhcPs
forall flag pass.
XHsOuterImplicit pass -> HsOuterTyVarBndrs flag pass
HsOuterImplicit
#else
    eqn_bndrs = Nothing
#endif

-- | Declares a type synonym.
--
-- > type A a b = B b a
-- > =====
-- > type' "A" [bvar "a", bvar "b"] $ var "B" @@ var "b" @@ var "a"
type' :: OccNameStr -> [HsTyVarBndr'] -> HsType' -> HsDecl'
type' :: OccNameStr -> [HsTyVarBndr'] -> HsType' -> HsDecl'
type' OccNameStr
name [HsTyVarBndr']
vars HsType'
t =
    (NoExtField -> TyClDecl GhcPs -> HsDecl')
-> TyClDecl GhcPs -> HsDecl'
forall a. (NoExtField -> a) -> a
noExt XTyClD GhcPs -> TyClDecl GhcPs -> HsDecl'
NoExtField -> TyClDecl GhcPs -> HsDecl'
forall p. XTyClD p -> TyClDecl p -> HsDecl p
TyClD (TyClDecl GhcPs -> HsDecl') -> TyClDecl GhcPs -> HsDecl'
forall a b. (a -> b) -> a -> b
$ TyClDecl GhcPs -> TyClDecl GhcPs
forall a. a -> a
withPlaceHolder (TyClDecl GhcPs -> TyClDecl GhcPs)
-> TyClDecl GhcPs -> TyClDecl GhcPs
forall a b. (a -> b) -> a -> b
$ (EpAnn [AddEpAnn]
 -> LocatedN RdrName
 -> LHsQTyVars GhcPs
 -> LexicalFixity
 -> GenLocated (SrcSpanAnn AnnListItem) HsType'
 -> TyClDecl GhcPs)
-> LocatedN RdrName
-> LHsQTyVars GhcPs
-> LexicalFixity
-> GenLocated (SrcSpanAnn AnnListItem) HsType'
-> TyClDecl GhcPs
forall ann a. (EpAnn ann -> a) -> a
withEpAnnNotUsed XSynDecl GhcPs
-> LIdP GhcPs
-> LHsQTyVars GhcPs
-> LexicalFixity
-> XRec GhcPs HsType'
-> TyClDecl GhcPs
EpAnn [AddEpAnn]
-> LocatedN RdrName
-> LHsQTyVars GhcPs
-> LexicalFixity
-> GenLocated (SrcSpanAnn AnnListItem) HsType'
-> TyClDecl GhcPs
forall pass.
XSynDecl pass
-> LIdP pass
-> LHsQTyVars pass
-> LexicalFixity
-> LHsType pass
-> TyClDecl pass
SynDecl (RdrNameStr -> LocatedN RdrName
typeRdrName (RdrNameStr -> LocatedN RdrName) -> RdrNameStr -> LocatedN RdrName
forall a b. (a -> b) -> a -> b
$ OccNameStr -> RdrNameStr
unqual OccNameStr
name)
        ([HsTyVarBndr'] -> LHsQTyVars GhcPs
mkQTyVars [HsTyVarBndr']
vars)
        LexicalFixity
Prefix
        (HsType' -> GenLocated (SrcSpanAnn AnnListItem) HsType'
forall a ann. a -> GenLocated (SrcSpanAnn ann) a
mkLocated HsType'
t)

newOrDataType
    :: NewOrData
    -> OccNameStr
    -> [HsTyVarBndr']
    -> [ConDecl']
    -> [HsDerivingClause']
    -> HsDecl'
newOrDataType :: NewOrData
-> OccNameStr
-> [HsTyVarBndr']
-> [ConDecl']
-> [HsDerivingClause']
-> HsDecl'
newOrDataType NewOrData
newOrData OccNameStr
name [HsTyVarBndr']
vars [ConDecl']
conDecls [HsDerivingClause']
derivs
    = (NoExtField -> TyClDecl GhcPs -> HsDecl')
-> TyClDecl GhcPs -> HsDecl'
forall a. (NoExtField -> a) -> a
noExt XTyClD GhcPs -> TyClDecl GhcPs -> HsDecl'
NoExtField -> TyClDecl GhcPs -> HsDecl'
forall p. XTyClD p -> TyClDecl p -> HsDecl p
TyClD (TyClDecl GhcPs -> HsDecl') -> TyClDecl GhcPs -> HsDecl'
forall a b. (a -> b) -> a -> b
$ TyClDecl GhcPs -> TyClDecl GhcPs
forall a. a -> a
withPlaceHolder (TyClDecl GhcPs -> TyClDecl GhcPs)
-> TyClDecl GhcPs -> TyClDecl GhcPs
forall a b. (a -> b) -> a -> b
$ TyClDecl GhcPs -> TyClDecl GhcPs
forall a. a -> a
withPlaceHolder (TyClDecl GhcPs -> TyClDecl GhcPs)
-> TyClDecl GhcPs -> TyClDecl GhcPs
forall a b. (a -> b) -> a -> b
$
        (EpAnn [AddEpAnn]
 -> LocatedN RdrName
 -> LHsQTyVars GhcPs
 -> LexicalFixity
 -> HsDataDefn GhcPs
 -> TyClDecl GhcPs)
-> LocatedN RdrName
-> LHsQTyVars GhcPs
-> LexicalFixity
-> HsDataDefn GhcPs
-> TyClDecl GhcPs
forall ann a. (EpAnn ann -> a) -> a
withEpAnnNotUsed XDataDecl GhcPs
-> LIdP GhcPs
-> LHsQTyVars GhcPs
-> LexicalFixity
-> HsDataDefn GhcPs
-> TyClDecl GhcPs
EpAnn [AddEpAnn]
-> LocatedN RdrName
-> LHsQTyVars GhcPs
-> LexicalFixity
-> HsDataDefn GhcPs
-> TyClDecl GhcPs
forall pass.
XDataDecl pass
-> LIdP pass
-> LHsQTyVars pass
-> LexicalFixity
-> HsDataDefn pass
-> TyClDecl pass
DataDecl (RdrNameStr -> LocatedN RdrName
typeRdrName (RdrNameStr -> LocatedN RdrName) -> RdrNameStr -> LocatedN RdrName
forall a b. (a -> b) -> a -> b
$ OccNameStr -> RdrNameStr
unqual OccNameStr
name)
            ([HsTyVarBndr'] -> LHsQTyVars GhcPs
mkQTyVars [HsTyVarBndr']
vars)
            LexicalFixity
Prefix
            (HsDataDefn GhcPs -> TyClDecl GhcPs)
-> HsDataDefn GhcPs -> TyClDecl GhcPs
forall a b. (a -> b) -> a -> b
$ (NoExtField
 -> Maybe
      (GenLocated
         (SrcSpanAnn AnnContext)
         [GenLocated (SrcSpanAnn AnnListItem) HsType'])
 -> Maybe (GenLocated SrcSpanAnnP CType)
 -> Maybe (GenLocated (SrcSpanAnn AnnListItem) HsType')
 -> DataDefnCons (GenLocated (SrcSpanAnn AnnListItem) ConDecl')
 -> [GenLocated (SrcSpanAnn NoEpAnns) HsDerivingClause']
 -> HsDataDefn GhcPs)
-> Maybe
     (GenLocated
        (SrcSpanAnn AnnContext)
        [GenLocated (SrcSpanAnn AnnListItem) HsType'])
-> Maybe (GenLocated SrcSpanAnnP CType)
-> Maybe (GenLocated (SrcSpanAnn AnnListItem) HsType')
-> DataDefnCons (GenLocated (SrcSpanAnn AnnListItem) ConDecl')
-> [GenLocated (SrcSpanAnn NoEpAnns) HsDerivingClause']
-> HsDataDefn GhcPs
forall a. (NoExtField -> a) -> a
noExt XCHsDataDefn GhcPs
-> Maybe (LHsContext GhcPs)
-> Maybe (XRec GhcPs CType)
-> Maybe (XRec GhcPs HsType')
-> DataDefnCons (LConDecl GhcPs)
-> HsDeriving GhcPs
-> HsDataDefn GhcPs
NoExtField
-> Maybe
     (GenLocated
        (SrcSpanAnn AnnContext)
        [GenLocated (SrcSpanAnn AnnListItem) HsType'])
-> Maybe (GenLocated SrcSpanAnnP CType)
-> Maybe (GenLocated (SrcSpanAnn AnnListItem) HsType')
-> DataDefnCons (GenLocated (SrcSpanAnn AnnListItem) ConDecl')
-> [GenLocated (SrcSpanAnn NoEpAnns) HsDerivingClause']
-> HsDataDefn GhcPs
forall pass.
XCHsDataDefn pass
-> Maybe (LHsContext pass)
-> Maybe (XRec pass CType)
-> Maybe (LHsKind pass)
-> DataDefnCons (LConDecl pass)
-> HsDeriving pass
-> HsDataDefn pass
HsDataDefn
#if !MIN_VERSION_ghc(9,6,0)
                newOrData
#endif
                Maybe
  (GenLocated
     (SrcSpanAnn AnnContext)
     [GenLocated (SrcSpanAnn AnnListItem) HsType'])
forall a. Maybe a
cxt
                Maybe (GenLocated SrcSpanAnnP CType)
forall a. Maybe a
Nothing
                Maybe (GenLocated (SrcSpanAnn AnnListItem) HsType')
forall a. Maybe a
Nothing
#if MIN_VERSION_ghc(9,6,0)
                (case NewOrData
newOrData of
                    NewOrData
NewType -> case [ConDecl']
conDecls of
                        [ConDecl'
decl] -> GenLocated (SrcSpanAnn AnnListItem) ConDecl'
-> DataDefnCons (GenLocated (SrcSpanAnn AnnListItem) ConDecl')
forall a. a -> DataDefnCons a
NewTypeCon (GenLocated (SrcSpanAnn AnnListItem) ConDecl'
 -> DataDefnCons (GenLocated (SrcSpanAnn AnnListItem) ConDecl'))
-> GenLocated (SrcSpanAnn AnnListItem) ConDecl'
-> DataDefnCons (GenLocated (SrcSpanAnn AnnListItem) ConDecl')
forall a b. (a -> b) -> a -> b
$ ConDecl' -> GenLocated (SrcSpanAnn AnnListItem) ConDecl'
forall a ann. a -> GenLocated (SrcSpanAnn ann) a
mkLocated ConDecl'
decl
                        [ConDecl']
_ -> [Char]
-> DataDefnCons (GenLocated (SrcSpanAnn AnnListItem) ConDecl')
forall a. HasCallStack => [Char] -> a
error [Char]
"NewTypeCon with more than one decl"
                    NewOrData
DataType -> Bool
-> [GenLocated (SrcSpanAnn AnnListItem) ConDecl']
-> DataDefnCons (GenLocated (SrcSpanAnn AnnListItem) ConDecl')
forall a. Bool -> [a] -> DataDefnCons a
DataTypeCons Bool
False ((ConDecl' -> GenLocated (SrcSpanAnn AnnListItem) ConDecl')
-> [ConDecl'] -> [GenLocated (SrcSpanAnn AnnListItem) ConDecl']
forall a b. (a -> b) -> [a] -> [b]
map ConDecl' -> GenLocated (SrcSpanAnn AnnListItem) ConDecl'
forall a ann. a -> GenLocated (SrcSpanAnn ann) a
mkLocated [ConDecl']
conDecls)
                )  
#else
                (map mkLocated conDecls)
#endif
#if MIN_VERSION_ghc(9,4,0)
                ([GenLocated (SrcSpanAnn NoEpAnns) HsDerivingClause']
-> [GenLocated (SrcSpanAnn NoEpAnns) HsDerivingClause']
forall a. a -> a
toHsDeriving ([GenLocated (SrcSpanAnn NoEpAnns) HsDerivingClause']
 -> [GenLocated (SrcSpanAnn NoEpAnns) HsDerivingClause'])
-> [GenLocated (SrcSpanAnn NoEpAnns) HsDerivingClause']
-> [GenLocated (SrcSpanAnn NoEpAnns) HsDerivingClause']
forall a b. (a -> b) -> a -> b
$ (HsDerivingClause'
 -> GenLocated (SrcSpanAnn NoEpAnns) HsDerivingClause')
-> [HsDerivingClause']
-> [GenLocated (SrcSpanAnn NoEpAnns) HsDerivingClause']
forall a b. (a -> b) -> [a] -> [b]
map HsDerivingClause'
-> GenLocated (SrcSpanAnn NoEpAnns) HsDerivingClause'
forall a ann. a -> GenLocated (SrcSpanAnn ann) a
mkLocated [HsDerivingClause']
derivs)
#else
                (toHsDeriving $ map builtLoc derivs)
#endif
  where
#if MIN_VERSION_ghc(9,2,0)
    cxt :: Maybe a
cxt = Maybe a
forall a. Maybe a
Nothing
#else
    cxt = builtLoc []
#endif
#if MIN_VERSION_ghc(9,2,0)
    toHsDeriving :: a -> a
toHsDeriving = a -> a
forall a. a -> a
id
#else
    toHsDeriving = mkLocated
#endif

-- | A newtype declaration.
--
-- > newtype Const a b = Const a deriving Eq
-- > =====
-- > newtype' "Const" [bvar "a", bvar "b"]
-- >    (conDecl "Const" [var "a"])
-- >    [var "Show"]
newtype' :: OccNameStr -> [HsTyVarBndr'] -> ConDecl' -> [HsDerivingClause'] -> HsDecl'
newtype' :: OccNameStr
-> [HsTyVarBndr'] -> ConDecl' -> [HsDerivingClause'] -> HsDecl'
newtype' OccNameStr
name [HsTyVarBndr']
vars ConDecl'
conD = NewOrData
-> OccNameStr
-> [HsTyVarBndr']
-> [ConDecl']
-> [HsDerivingClause']
-> HsDecl'
newOrDataType NewOrData
NewType OccNameStr
name [HsTyVarBndr']
vars [ConDecl'
conD]

-- | A data declaration.
--
-- > data Either a b = Left a | Right b
-- >    deriving Show
-- > =====
-- > data' "Either" [bvar "a", bvar "b"]
-- >   [ conDecl "Left" [var "a"]
-- >   , conDecl "Right" [var "b"]
-- >   ]
-- >   [var "Show"]
data' :: OccNameStr -> [HsTyVarBndr'] -> [ConDecl'] -> [HsDerivingClause'] -> HsDecl'
data' :: OccNameStr
-> [HsTyVarBndr'] -> [ConDecl'] -> [HsDerivingClause'] -> HsDecl'
data' = NewOrData
-> OccNameStr
-> [HsTyVarBndr']
-> [ConDecl']
-> [HsDerivingClause']
-> HsDecl'
newOrDataType NewOrData
DataType

-- | Declares a Haskell-98-style prefix constructor for a data or type
-- declaration.
--
-- > Foo a Int
-- > =====
-- > prefixCon "Foo" [field (var "a"), field (var "Int")]
prefixCon :: OccNameStr -> [Field] -> ConDecl'
prefixCon :: OccNameStr -> [Field] -> ConDecl'
prefixCon OccNameStr
name [Field]
fields = OccNameStr -> HsConDeclDetails' -> ConDecl'
renderCon98Decl OccNameStr
name
    (HsConDeclDetails' -> ConDecl') -> HsConDeclDetails' -> ConDecl'
forall a b. (a -> b) -> a -> b
$ [HsScaled GhcPs (XRec GhcPs HsType')] -> HsConDeclDetails'
forall {arg} {tyarg} {rec}. [arg] -> HsConDetails tyarg arg rec
prefixCon' ([HsScaled GhcPs (XRec GhcPs HsType')] -> HsConDeclDetails')
-> [HsScaled GhcPs (XRec GhcPs HsType')] -> HsConDeclDetails'
forall a b. (a -> b) -> a -> b
$ (Field
 -> HsScaled GhcPs (GenLocated (SrcSpanAnn AnnListItem) HsType'))
-> [Field]
-> [HsScaled GhcPs (GenLocated (SrcSpanAnn AnnListItem) HsType')]
forall a b. (a -> b) -> [a] -> [b]
map (GenLocated (SrcSpanAnn AnnListItem) HsType'
-> HsScaled GhcPs (GenLocated (SrcSpanAnn AnnListItem) HsType')
forall a (p :: Pass). a -> HsScaled (GhcPass p) a
hsUnrestricted (GenLocated (SrcSpanAnn AnnListItem) HsType'
 -> HsScaled GhcPs (GenLocated (SrcSpanAnn AnnListItem) HsType'))
-> (Field -> GenLocated (SrcSpanAnn AnnListItem) HsType')
-> Field
-> HsScaled GhcPs (GenLocated (SrcSpanAnn AnnListItem) HsType')
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Field -> XRec GhcPs HsType'
Field -> GenLocated (SrcSpanAnn AnnListItem) HsType'
renderField) [Field]
fields
  where
#if MIN_VERSION_ghc(9,2,0)
    prefixCon' :: [arg] -> HsConDetails tyarg arg rec
prefixCon' = [tyarg] -> [arg] -> HsConDetails tyarg arg rec
forall tyarg arg rec.
[tyarg] -> [arg] -> HsConDetails tyarg arg rec
PrefixCon []
#else
    prefixCon' = PrefixCon
#endif

-- | Declares a Haskell-98-style infix constructor for a data or type
-- declaration.
--
-- > A b :+: C d
-- > =====
-- > infixCon (field (var "A" @@ var "b")) ":+:" (field (Var "C" @@ var "d"))
infixCon :: Field -> OccNameStr -> Field -> ConDecl'
infixCon :: Field -> OccNameStr -> Field -> ConDecl'
infixCon Field
f OccNameStr
name Field
f' = OccNameStr -> HsConDeclDetails' -> ConDecl'
renderCon98Decl OccNameStr
name
    (HsConDeclDetails' -> ConDecl') -> HsConDeclDetails' -> ConDecl'
forall a b. (a -> b) -> a -> b
$ HsScaled GhcPs (GenLocated (SrcSpanAnn AnnListItem) HsType')
-> HsScaled GhcPs (GenLocated (SrcSpanAnn AnnListItem) HsType')
-> HsConDetails
     Void
     (HsScaled GhcPs (GenLocated (SrcSpanAnn AnnListItem) HsType'))
     (GenLocated
        SrcSpanAnnL
        [GenLocated (SrcSpanAnn AnnListItem) (ConDeclField GhcPs)])
forall tyarg arg rec. arg -> arg -> HsConDetails tyarg arg rec
InfixCon (XRec GhcPs HsType' -> HsScaled GhcPs (XRec GhcPs HsType')
forall a (p :: Pass). a -> HsScaled (GhcPass p) a
hsUnrestricted (XRec GhcPs HsType' -> HsScaled GhcPs (XRec GhcPs HsType'))
-> XRec GhcPs HsType' -> HsScaled GhcPs (XRec GhcPs HsType')
forall a b. (a -> b) -> a -> b
$ Field -> XRec GhcPs HsType'
renderField Field
f) (XRec GhcPs HsType' -> HsScaled GhcPs (XRec GhcPs HsType')
forall a (p :: Pass). a -> HsScaled (GhcPass p) a
hsUnrestricted (XRec GhcPs HsType' -> HsScaled GhcPs (XRec GhcPs HsType'))
-> XRec GhcPs HsType' -> HsScaled GhcPs (XRec GhcPs HsType')
forall a b. (a -> b) -> a -> b
$ Field -> XRec GhcPs HsType'
renderField Field
f')

-- | Declares Haskell-98-style record constructor for a data or type
-- declaration.
--
-- > A { x :: B, y :: C }
-- > =====
-- > recordCon "A" [("x", var "B"), ("y", var "C")]
recordCon :: OccNameStr -> [(OccNameStr, Field)] -> ConDecl'
recordCon :: OccNameStr -> [(OccNameStr, Field)] -> ConDecl'
recordCon OccNameStr
name [(OccNameStr, Field)]
fields = OccNameStr -> HsConDeclDetails' -> ConDecl'
renderCon98Decl OccNameStr
name
    (HsConDeclDetails' -> ConDecl') -> HsConDeclDetails' -> ConDecl'
forall a b. (a -> b) -> a -> b
$ XRec GhcPs [LConDeclField GhcPs] -> HsConDeclDetails'
forall tyarg arg rec. rec -> HsConDetails tyarg arg rec
RecCon (XRec GhcPs [LConDeclField GhcPs] -> HsConDeclDetails')
-> XRec GhcPs [LConDeclField GhcPs] -> HsConDeclDetails'
forall a b. (a -> b) -> a -> b
$ [GenLocated (SrcSpanAnn AnnListItem) (ConDeclField GhcPs)]
-> GenLocated
     SrcSpanAnnL
     [GenLocated (SrcSpanAnn AnnListItem) (ConDeclField GhcPs)]
forall a ann. a -> GenLocated (SrcSpanAnn ann) a
mkLocated ([GenLocated (SrcSpanAnn AnnListItem) (ConDeclField GhcPs)]
 -> GenLocated
      SrcSpanAnnL
      [GenLocated (SrcSpanAnn AnnListItem) (ConDeclField GhcPs)])
-> [GenLocated (SrcSpanAnn AnnListItem) (ConDeclField GhcPs)]
-> GenLocated
     SrcSpanAnnL
     [GenLocated (SrcSpanAnn AnnListItem) (ConDeclField GhcPs)]
forall a b. (a -> b) -> a -> b
$ ((OccNameStr, Field)
 -> GenLocated (SrcSpanAnn AnnListItem) (ConDeclField GhcPs))
-> [(OccNameStr, Field)]
-> [GenLocated (SrcSpanAnn AnnListItem) (ConDeclField GhcPs)]
forall a b. (a -> b) -> [a] -> [b]
map (OccNameStr, Field)
-> GenLocated (SrcSpanAnn AnnListItem) (ConDeclField GhcPs)
forall {ann}.
(OccNameStr, Field)
-> GenLocated (SrcSpanAnn ann) (ConDeclField GhcPs)
mkLConDeclField [(OccNameStr, Field)]
fields
  where
    mkLConDeclField :: (OccNameStr, Field)
-> GenLocated (SrcSpanAnn ann) (ConDeclField GhcPs)
mkLConDeclField (OccNameStr
n, Field
f) =
        ConDeclField GhcPs
-> GenLocated (SrcSpanAnn ann) (ConDeclField GhcPs)
forall a ann. a -> GenLocated (SrcSpanAnn ann) a
mkLocated (ConDeclField GhcPs
 -> GenLocated (SrcSpanAnn ann) (ConDeclField GhcPs))
-> ConDeclField GhcPs
-> GenLocated (SrcSpanAnn ann) (ConDeclField GhcPs)
forall a b. (a -> b) -> a -> b
$ (EpAnn [AddEpAnn]
 -> [GenLocated (SrcSpanAnn NoEpAnns) (FieldOcc GhcPs)]
 -> XRec GhcPs HsType'
 -> Maybe (LHsDoc GhcPs)
 -> ConDeclField GhcPs)
-> [GenLocated (SrcSpanAnn NoEpAnns) (FieldOcc GhcPs)]
-> XRec GhcPs HsType'
-> Maybe (LHsDoc GhcPs)
-> ConDeclField GhcPs
forall ann a. (EpAnn ann -> a) -> a
withEpAnnNotUsed XConDeclField GhcPs
-> [LFieldOcc GhcPs]
-> XRec GhcPs HsType'
-> Maybe (LHsDoc GhcPs)
-> ConDeclField GhcPs
EpAnn [AddEpAnn]
-> [GenLocated (SrcSpanAnn NoEpAnns) (FieldOcc GhcPs)]
-> XRec GhcPs HsType'
-> Maybe (LHsDoc GhcPs)
-> ConDeclField GhcPs
forall pass.
XConDeclField pass
-> [LFieldOcc pass]
-> LBangType pass
-> Maybe (LHsDoc pass)
-> ConDeclField pass
ConDeclField
#if MIN_VERSION_ghc(9,4,0)
                        [FieldOcc GhcPs -> GenLocated (SrcSpanAnn NoEpAnns) (FieldOcc GhcPs)
forall a ann. a -> GenLocated (SrcSpanAnn ann) a
mkLocated (FieldOcc GhcPs
 -> GenLocated (SrcSpanAnn NoEpAnns) (FieldOcc GhcPs))
-> FieldOcc GhcPs
-> GenLocated (SrcSpanAnn NoEpAnns) (FieldOcc GhcPs)
forall a b. (a -> b) -> a -> b
$ FieldOcc GhcPs -> FieldOcc GhcPs
forall a. a -> a
withPlaceHolder (FieldOcc GhcPs -> FieldOcc GhcPs)
-> FieldOcc GhcPs -> FieldOcc GhcPs
forall a b. (a -> b) -> a -> b
$ (NoExtField -> LocatedN RdrName -> FieldOcc GhcPs)
-> LocatedN RdrName -> FieldOcc GhcPs
forall a. (NoExtField -> a) -> a
noExt XCFieldOcc GhcPs -> XRec GhcPs RdrName -> FieldOcc GhcPs
NoExtField -> LocatedN RdrName -> FieldOcc GhcPs
forall pass. XCFieldOcc pass -> XRec pass RdrName -> FieldOcc pass
FieldOcc (LocatedN RdrName -> FieldOcc GhcPs)
-> LocatedN RdrName -> FieldOcc GhcPs
forall a b. (a -> b) -> a -> b
$ RdrNameStr -> LocatedN RdrName
valueRdrName (RdrNameStr -> LocatedN RdrName) -> RdrNameStr -> LocatedN RdrName
forall a b. (a -> b) -> a -> b
$ OccNameStr -> RdrNameStr
unqual OccNameStr
n]
#else
                        [builtLoc $ withPlaceHolder $ noExt FieldOcc $ valueRdrName $ unqual n]
#endif
                        (Field -> XRec GhcPs HsType'
renderField Field
f)
                        Maybe (LHsDoc GhcPs)
forall a. Maybe a
Nothing

-- | An individual argument of a data constructor.  Contains a type for the field,
-- and whether the field is strict or lazy.
data Field = Field
    { Field -> HsType'
fieldType :: HsType'
    , Field -> SrcStrictness
strictness :: SrcStrictness
    }

-- | A field with no explicit strictness annotations.
--
-- > A b
-- > =====
-- > field $ var "A" @@ var "b"
field :: HsType' -> Field
field :: HsType' -> Field
field HsType'
t = HsType' -> SrcStrictness -> Field
Field HsType'
t SrcStrictness
NoSrcStrict

-- | Give a field an explicit strictness annotation.  Overrides any such previous
-- annotations (for example, from 'lazy').
--
-- > !(A b)
-- > =====
-- > strict $ field $ var "A" @@ var "b"
strict :: Field -> Field
strict :: Field -> Field
strict Field
f = Field
f { strictness = SrcStrict }

-- | Give a field an explicit laziness annotation.  This feature is useful in combination
-- with the @StrictData@ extension.  Overrides any such previous
-- annotations (for example, from 'strict').
--
-- > !(A b)
-- > =====
-- > strict $ field $ var "A" @@ var "b"
lazy :: Field -> Field
lazy :: Field -> Field
lazy Field
f = Field
f { strictness = SrcLazy }

#if !MIN_VERSION_ghc(9,0,0)
hsUnrestricted :: a -> a
hsUnrestricted = id
#endif

renderField :: Field -> LHsType GhcPs
-- TODO: parenthesizeTypeForApp is an overestimate in the case of
-- rendering an infix or record type.
renderField :: Field -> XRec GhcPs HsType'
renderField Field
f = GenLocated (SrcSpanAnn AnnListItem) HsType'
-> GenLocated (SrcSpanAnn AnnListItem) HsType'
wrap (GenLocated (SrcSpanAnn AnnListItem) HsType'
 -> GenLocated (SrcSpanAnn AnnListItem) HsType')
-> GenLocated (SrcSpanAnn AnnListItem) HsType'
-> GenLocated (SrcSpanAnn AnnListItem) HsType'
forall a b. (a -> b) -> a -> b
$ XRec GhcPs HsType' -> XRec GhcPs HsType'
parenthesizeTypeForApp (XRec GhcPs HsType' -> XRec GhcPs HsType')
-> XRec GhcPs HsType' -> XRec GhcPs HsType'
forall a b. (a -> b) -> a -> b
$ HsType' -> GenLocated (SrcSpanAnn AnnListItem) HsType'
forall a ann. a -> GenLocated (SrcSpanAnn ann) a
mkLocated (HsType' -> GenLocated (SrcSpanAnn AnnListItem) HsType')
-> HsType' -> GenLocated (SrcSpanAnn AnnListItem) HsType'
forall a b. (a -> b) -> a -> b
$ Field -> HsType'
fieldType Field
f
  where
    wrap :: GenLocated (SrcSpanAnn AnnListItem) HsType'
-> GenLocated (SrcSpanAnn AnnListItem) HsType'
wrap = case Field -> SrcStrictness
strictness Field
f of
        SrcStrictness
NoSrcStrict -> GenLocated (SrcSpanAnn AnnListItem) HsType'
-> GenLocated (SrcSpanAnn AnnListItem) HsType'
forall a. a -> a
id
        SrcStrictness
s -> HsType' -> GenLocated (SrcSpanAnn AnnListItem) HsType'
forall a ann. a -> GenLocated (SrcSpanAnn ann) a
mkLocated (HsType' -> GenLocated (SrcSpanAnn AnnListItem) HsType')
-> (GenLocated (SrcSpanAnn AnnListItem) HsType' -> HsType')
-> GenLocated (SrcSpanAnn AnnListItem) HsType'
-> GenLocated (SrcSpanAnn AnnListItem) HsType'
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ((EpAnn [AddEpAnn]
 -> HsSrcBang
 -> GenLocated (SrcSpanAnn AnnListItem) HsType'
 -> HsType')
-> HsSrcBang
-> GenLocated (SrcSpanAnn AnnListItem) HsType'
-> HsType'
forall ann a. (EpAnn ann -> a) -> a
withEpAnnNotUsed XBangTy GhcPs -> HsSrcBang -> XRec GhcPs HsType' -> HsType'
EpAnn [AddEpAnn]
-> HsSrcBang
-> GenLocated (SrcSpanAnn AnnListItem) HsType'
-> HsType'
forall pass.
XBangTy pass -> HsSrcBang -> LHsType pass -> HsType pass
HsBangTy (HsSrcBang
 -> GenLocated (SrcSpanAnn AnnListItem) HsType' -> HsType')
-> HsSrcBang
-> GenLocated (SrcSpanAnn AnnListItem) HsType'
-> HsType'
forall a b. (a -> b) -> a -> b
$ (SourceText -> SrcUnpackedness -> SrcStrictness -> HsSrcBang)
-> SrcUnpackedness -> SrcStrictness -> HsSrcBang
forall a. (SourceText -> a) -> a
noSourceText SourceText -> SrcUnpackedness -> SrcStrictness -> HsSrcBang
HsSrcBang SrcUnpackedness
NoSrcUnpack SrcStrictness
s)

renderCon98Decl :: OccNameStr -> HsConDeclDetails' -> ConDecl'
renderCon98Decl :: OccNameStr -> HsConDeclDetails' -> ConDecl'
renderCon98Decl OccNameStr
name HsConDeclDetails'
details =
    LIdP GhcPs
-> Bool
-> [XRec GhcPs (HsTyVarBndr Specificity GhcPs)]
-> Maybe (LHsContext GhcPs)
-> HsConDeclDetails'
-> Maybe (LHsDoc GhcPs)
-> ConDecl'
conDeclH98 (RdrNameStr -> LocatedN RdrName
typeRdrName (RdrNameStr -> LocatedN RdrName) -> RdrNameStr -> LocatedN RdrName
forall a b. (a -> b) -> a -> b
$ OccNameStr -> RdrNameStr
unqual OccNameStr
name) Bool
False [] Maybe (LHsContext GhcPs)
Maybe
  (GenLocated
     (SrcSpanAnn AnnContext)
     [GenLocated (SrcSpanAnn AnnListItem) HsType'])
forall a. Maybe a
Nothing HsConDeclDetails'
details Maybe (LHsDoc GhcPs)
forall a. Maybe a
Nothing
  where
#if MIN_VERSION_ghc(9,2,0)
    conDeclH98 :: LIdP GhcPs
-> Bool
-> [XRec GhcPs (HsTyVarBndr Specificity GhcPs)]
-> Maybe (LHsContext GhcPs)
-> HsConDeclDetails'
-> Maybe (LHsDoc GhcPs)
-> ConDecl'
conDeclH98 = (EpAnn [AddEpAnn]
 -> LIdP GhcPs
 -> Bool
 -> [XRec GhcPs (HsTyVarBndr Specificity GhcPs)]
 -> Maybe (LHsContext GhcPs)
 -> HsConDeclDetails'
 -> Maybe (LHsDoc GhcPs)
 -> ConDecl')
-> LIdP GhcPs
-> Bool
-> [XRec GhcPs (HsTyVarBndr Specificity GhcPs)]
-> Maybe (LHsContext GhcPs)
-> HsConDeclDetails'
-> Maybe (LHsDoc GhcPs)
-> ConDecl'
forall ann a. (EpAnn ann -> a) -> a
withEpAnnNotUsed XConDeclH98 GhcPs
-> LIdP GhcPs
-> Bool
-> [XRec GhcPs (HsTyVarBndr Specificity GhcPs)]
-> Maybe (LHsContext GhcPs)
-> HsConDeclDetails'
-> Maybe (LHsDoc GhcPs)
-> ConDecl'
EpAnn [AddEpAnn]
-> LIdP GhcPs
-> Bool
-> [XRec GhcPs (HsTyVarBndr Specificity GhcPs)]
-> Maybe (LHsContext GhcPs)
-> HsConDeclDetails'
-> Maybe (LHsDoc GhcPs)
-> ConDecl'
forall pass.
XConDeclH98 pass
-> LIdP pass
-> Bool
-> [LHsTyVarBndr Specificity pass]
-> Maybe (LHsContext pass)
-> HsConDeclH98Details pass
-> Maybe (LHsDoc pass)
-> ConDecl pass
ConDeclH98
#elif MIN_VERSION_ghc(8,6,0)
    conDeclH98 n = noExt ConDeclH98 n . builtLoc
#else
    conDeclH98 n _ _ = ConDeclH98 n Nothing
#endif

deriving' :: [HsType'] -> HsDerivingClause'
deriving' :: [HsType'] -> HsDerivingClause'
deriving' = Maybe DerivStrategy' -> [HsType'] -> HsDerivingClause'
derivingWay Maybe DerivStrategy'
forall a. Maybe a
Nothing

derivingWay :: Maybe DerivStrategy' -> [HsType'] -> HsDerivingClause'
derivingWay :: Maybe DerivStrategy' -> [HsType'] -> HsDerivingClause'
derivingWay Maybe DerivStrategy'
way [HsType']
ts =
#if MIN_VERSION_ghc(9,4,0)
    (EpAnn [AddEpAnn]
 -> Maybe (GenLocated (SrcSpanAnn NoEpAnns) DerivStrategy')
 -> GenLocated (SrcSpanAnn AnnContext) (DerivClauseTys GhcPs)
 -> HsDerivingClause')
-> Maybe (GenLocated (SrcSpanAnn NoEpAnns) DerivStrategy')
-> GenLocated (SrcSpanAnn AnnContext) (DerivClauseTys GhcPs)
-> HsDerivingClause'
forall ann a. (EpAnn ann -> a) -> a
withEpAnnNotUsed XCHsDerivingClause GhcPs
-> Maybe (LDerivStrategy GhcPs)
-> LDerivClauseTys GhcPs
-> HsDerivingClause'
EpAnn [AddEpAnn]
-> Maybe (GenLocated (SrcSpanAnn NoEpAnns) DerivStrategy')
-> GenLocated (SrcSpanAnn AnnContext) (DerivClauseTys GhcPs)
-> HsDerivingClause'
forall pass.
XCHsDerivingClause pass
-> Maybe (LDerivStrategy pass)
-> LDerivClauseTys pass
-> HsDerivingClause pass
HsDerivingClause ((DerivStrategy' -> GenLocated (SrcSpanAnn NoEpAnns) DerivStrategy')
-> Maybe DerivStrategy'
-> Maybe (GenLocated (SrcSpanAnn NoEpAnns) DerivStrategy')
forall a b. (a -> b) -> Maybe a -> Maybe b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap DerivStrategy' -> GenLocated (SrcSpanAnn NoEpAnns) DerivStrategy'
forall a ann. a -> GenLocated (SrcSpanAnn ann) a
mkLocated Maybe DerivStrategy'
way) (GenLocated (SrcSpanAnn AnnContext) (DerivClauseTys GhcPs)
 -> HsDerivingClause')
-> GenLocated (SrcSpanAnn AnnContext) (DerivClauseTys GhcPs)
-> HsDerivingClause'
forall a b. (a -> b) -> a -> b
$ DerivClauseTys GhcPs
-> GenLocated (SrcSpanAnn AnnContext) (DerivClauseTys GhcPs)
forall a ann. a -> GenLocated (SrcSpanAnn ann) a
mkLocated (DerivClauseTys GhcPs
 -> GenLocated (SrcSpanAnn AnnContext) (DerivClauseTys GhcPs))
-> DerivClauseTys GhcPs
-> GenLocated (SrcSpanAnn AnnContext) (DerivClauseTys GhcPs)
forall a b. (a -> b) -> a -> b
$ [LHsSigType GhcPs] -> DerivClauseTys GhcPs
forall {pass}.
(XDctSingle pass ~ NoExtField, XDctMulti pass ~ NoExtField) =>
[XRec pass (HsSigType pass)] -> DerivClauseTys pass
derivClauseTys ([LHsSigType GhcPs] -> DerivClauseTys GhcPs)
-> [LHsSigType GhcPs] -> DerivClauseTys GhcPs
forall a b. (a -> b) -> a -> b
$ (HsType' -> GenLocated (SrcSpanAnn AnnListItem) (HsSigType GhcPs))
-> [HsType']
-> [GenLocated (SrcSpanAnn AnnListItem) (HsSigType GhcPs)]
forall a b. (a -> b) -> [a] -> [b]
map HsType' -> LHsSigType GhcPs
HsType' -> GenLocated (SrcSpanAnn AnnListItem) (HsSigType GhcPs)
sigType [HsType']
ts
#else
    withEpAnnNotUsed HsDerivingClause (fmap builtLoc way) $ mkLocated $ derivClauseTys $ map sigType ts
#endif
  where
#if MIN_VERSION_ghc(9,2,0)
    derivClauseTys :: [XRec pass (HsSigType pass)] -> DerivClauseTys pass
derivClauseTys [XRec pass (HsSigType pass)
x] = (NoExtField -> XRec pass (HsSigType pass) -> DerivClauseTys pass)
-> XRec pass (HsSigType pass) -> DerivClauseTys pass
forall a. (NoExtField -> a) -> a
noExt XDctSingle pass
-> XRec pass (HsSigType pass) -> DerivClauseTys pass
NoExtField -> XRec pass (HsSigType pass) -> DerivClauseTys pass
forall pass.
XDctSingle pass -> LHsSigType pass -> DerivClauseTys pass
DctSingle XRec pass (HsSigType pass)
x
    derivClauseTys [XRec pass (HsSigType pass)]
xs = (NoExtField -> [XRec pass (HsSigType pass)] -> DerivClauseTys pass)
-> [XRec pass (HsSigType pass)] -> DerivClauseTys pass
forall a. (NoExtField -> a) -> a
noExt XDctMulti pass
-> [XRec pass (HsSigType pass)] -> DerivClauseTys pass
NoExtField -> [XRec pass (HsSigType pass)] -> DerivClauseTys pass
forall pass.
XDctMulti pass -> [LHsSigType pass] -> DerivClauseTys pass
DctMulti [XRec pass (HsSigType pass)]
xs
#else
    derivClauseTys = id
#endif

derivingStock :: [HsType'] -> HsDerivingClause'
derivingStock :: [HsType'] -> HsDerivingClause'
derivingStock = Maybe DerivStrategy' -> [HsType'] -> HsDerivingClause'
derivingWay (DerivStrategy' -> Maybe DerivStrategy'
forall {a}. a -> Maybe a
Just DerivStrategy'
strat)
  where
#if MIN_VERSION_ghc(9,2,0)
    strat :: DerivStrategy'
strat = (EpAnn [AddEpAnn] -> DerivStrategy') -> DerivStrategy'
forall ann a. (EpAnn ann -> a) -> a
withEpAnnNotUsed XStockStrategy GhcPs -> DerivStrategy'
EpAnn [AddEpAnn] -> DerivStrategy'
forall pass. XStockStrategy pass -> DerivStrategy pass
StockStrategy
#else
    strat = StockStrategy
#endif

derivingNewtype :: [HsType'] -> HsDerivingClause'
derivingNewtype :: [HsType'] -> HsDerivingClause'
derivingNewtype = Maybe DerivStrategy' -> [HsType'] -> HsDerivingClause'
derivingWay (DerivStrategy' -> Maybe DerivStrategy'
forall {a}. a -> Maybe a
Just DerivStrategy'
strat)
  where
#if MIN_VERSION_ghc(9,2,0)
    strat :: DerivStrategy'
strat = (EpAnn [AddEpAnn] -> DerivStrategy') -> DerivStrategy'
forall ann a. (EpAnn ann -> a) -> a
withEpAnnNotUsed XNewtypeStrategy GhcPs -> DerivStrategy'
EpAnn [AddEpAnn] -> DerivStrategy'
forall pass. XNewtypeStrategy pass -> DerivStrategy pass
NewtypeStrategy
#else
    strat = NewtypeStrategy
#endif

derivingAnyclass :: [HsType'] -> HsDerivingClause'
derivingAnyclass :: [HsType'] -> HsDerivingClause'
derivingAnyclass = Maybe DerivStrategy' -> [HsType'] -> HsDerivingClause'
derivingWay (DerivStrategy' -> Maybe DerivStrategy'
forall {a}. a -> Maybe a
Just DerivStrategy'
strat)
  where
#if MIN_VERSION_ghc(9,2,0)
    strat :: DerivStrategy'
strat = (EpAnn [AddEpAnn] -> DerivStrategy') -> DerivStrategy'
forall ann a. (EpAnn ann -> a) -> a
withEpAnnNotUsed XAnyClassStrategy GhcPs -> DerivStrategy'
EpAnn [AddEpAnn] -> DerivStrategy'
forall pass. XAnyClassStrategy pass -> DerivStrategy pass
AnyclassStrategy
#else
    strat = AnyclassStrategy
#endif

#if MIN_VERSION_ghc(8,6,0)
-- | A `DerivingVia` clause.
--
-- > deriving (Eq, Show) via T
-- > =====
-- > derivingVia (var "T") [var "Eq", var "Show"]
-- Available with @ghc>=8.6@.
derivingVia :: HsType' -> [HsType'] -> HsDerivingClause'
derivingVia :: HsType' -> [HsType'] -> HsDerivingClause'
derivingVia HsType'
t = Maybe DerivStrategy' -> [HsType'] -> HsDerivingClause'
derivingWay (DerivStrategy' -> Maybe DerivStrategy'
forall {a}. a -> Maybe a
Just (DerivStrategy' -> Maybe DerivStrategy')
-> DerivStrategy' -> Maybe DerivStrategy'
forall a b. (a -> b) -> a -> b
$ GenLocated (SrcSpanAnn AnnListItem) (HsSigType GhcPs)
-> DerivStrategy'
strat (GenLocated (SrcSpanAnn AnnListItem) (HsSigType GhcPs)
 -> DerivStrategy')
-> GenLocated (SrcSpanAnn AnnListItem) (HsSigType GhcPs)
-> DerivStrategy'
forall a b. (a -> b) -> a -> b
$ HsType' -> LHsSigType GhcPs
sigType HsType'
t)
  where
#if MIN_VERSION_ghc(9,2,0)
    strat :: GenLocated (SrcSpanAnn AnnListItem) (HsSigType GhcPs)
-> DerivStrategy'
strat = XViaStrategy GhcPs -> DerivStrategy'
XViaStrategyPs -> DerivStrategy'
forall pass. XViaStrategy pass -> DerivStrategy pass
ViaStrategy (XViaStrategyPs -> DerivStrategy')
-> (GenLocated (SrcSpanAnn AnnListItem) (HsSigType GhcPs)
    -> XViaStrategyPs)
-> GenLocated (SrcSpanAnn AnnListItem) (HsSigType GhcPs)
-> DerivStrategy'
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (EpAnn [AddEpAnn]
 -> GenLocated (SrcSpanAnn AnnListItem) (HsSigType GhcPs)
 -> XViaStrategyPs)
-> GenLocated (SrcSpanAnn AnnListItem) (HsSigType GhcPs)
-> XViaStrategyPs
forall ann a. (EpAnn ann -> a) -> a
withEpAnnNotUsed EpAnn [AddEpAnn] -> LHsSigType GhcPs -> XViaStrategyPs
EpAnn [AddEpAnn]
-> GenLocated (SrcSpanAnn AnnListItem) (HsSigType GhcPs)
-> XViaStrategyPs
XViaStrategyPs
#else
    strat = ViaStrategy
#endif
#endif

standaloneDeriving :: HsType' -> HsDecl'
standaloneDeriving :: HsType' -> HsDecl'
standaloneDeriving = Maybe DerivStrategy' -> HsType' -> HsDecl'
standaloneDerivingWay Maybe DerivStrategy'
forall a. Maybe a
Nothing

standaloneDerivingStock :: HsType' -> HsDecl'
standaloneDerivingStock :: HsType' -> HsDecl'
standaloneDerivingStock = Maybe DerivStrategy' -> HsType' -> HsDecl'
standaloneDerivingWay (DerivStrategy' -> Maybe DerivStrategy'
forall {a}. a -> Maybe a
Just DerivStrategy'
strat)
  where
#if MIN_VERSION_ghc(9,2,0)
    strat :: DerivStrategy'
strat = (EpAnn [AddEpAnn] -> DerivStrategy') -> DerivStrategy'
forall ann a. (EpAnn ann -> a) -> a
withEpAnnNotUsed XStockStrategy GhcPs -> DerivStrategy'
EpAnn [AddEpAnn] -> DerivStrategy'
forall pass. XStockStrategy pass -> DerivStrategy pass
StockStrategy
#else
    strat = StockStrategy
#endif

standaloneDerivingNewtype :: HsType' -> HsDecl'
standaloneDerivingNewtype :: HsType' -> HsDecl'
standaloneDerivingNewtype = Maybe DerivStrategy' -> HsType' -> HsDecl'
standaloneDerivingWay (DerivStrategy' -> Maybe DerivStrategy'
forall {a}. a -> Maybe a
Just DerivStrategy'
strat)
  where
#if MIN_VERSION_ghc(9,2,0)
    strat :: DerivStrategy'
strat = (EpAnn [AddEpAnn] -> DerivStrategy') -> DerivStrategy'
forall ann a. (EpAnn ann -> a) -> a
withEpAnnNotUsed XNewtypeStrategy GhcPs -> DerivStrategy'
EpAnn [AddEpAnn] -> DerivStrategy'
forall pass. XNewtypeStrategy pass -> DerivStrategy pass
NewtypeStrategy
#else
    strat = NewtypeStrategy
#endif

standaloneDerivingAnyclass :: HsType' -> HsDecl'
standaloneDerivingAnyclass :: HsType' -> HsDecl'
standaloneDerivingAnyclass = Maybe DerivStrategy' -> HsType' -> HsDecl'
standaloneDerivingWay (DerivStrategy' -> Maybe DerivStrategy'
forall {a}. a -> Maybe a
Just DerivStrategy'
strat)
  where
#if MIN_VERSION_ghc(9,2,0)
    strat :: DerivStrategy'
strat = (EpAnn [AddEpAnn] -> DerivStrategy') -> DerivStrategy'
forall ann a. (EpAnn ann -> a) -> a
withEpAnnNotUsed XAnyClassStrategy GhcPs -> DerivStrategy'
EpAnn [AddEpAnn] -> DerivStrategy'
forall pass. XAnyClassStrategy pass -> DerivStrategy pass
AnyclassStrategy
#else
    strat = AnyclassStrategy
#endif

standaloneDerivingWay :: Maybe DerivStrategy' -> HsType' -> HsDecl'
standaloneDerivingWay :: Maybe DerivStrategy' -> HsType' -> HsDecl'
standaloneDerivingWay Maybe DerivStrategy'
way HsType'
ty = (NoExtField -> DerivDecl GhcPs -> HsDecl')
-> DerivDecl GhcPs -> HsDecl'
forall a. (NoExtField -> a) -> a
noExt XDerivD GhcPs -> DerivDecl GhcPs -> HsDecl'
NoExtField -> DerivDecl GhcPs -> HsDecl'
forall p. XDerivD p -> DerivDecl p -> HsDecl p
DerivD DerivDecl GhcPs
derivDecl
  where derivDecl :: DerivDecl GhcPs
derivDecl =
#if MIN_VERSION_ghc(9,4,0)
          (EpAnn [AddEpAnn]
 -> HsWildCardBndrs
      GhcPs (GenLocated (SrcSpanAnn AnnListItem) (HsSigType GhcPs))
 -> Maybe (GenLocated (SrcSpanAnn NoEpAnns) DerivStrategy')
 -> Maybe (GenLocated SrcSpanAnnP OverlapMode)
 -> DerivDecl GhcPs)
-> HsWildCardBndrs
     GhcPs (GenLocated (SrcSpanAnn AnnListItem) (HsSigType GhcPs))
-> Maybe (GenLocated (SrcSpanAnn NoEpAnns) DerivStrategy')
-> Maybe (GenLocated SrcSpanAnnP OverlapMode)
-> DerivDecl GhcPs
forall ann a. (EpAnn ann -> a) -> a
withEpAnnNotUsed XCDerivDecl GhcPs
-> LHsSigWcType GhcPs
-> Maybe (LDerivStrategy GhcPs)
-> Maybe (XRec GhcPs OverlapMode)
-> DerivDecl GhcPs
EpAnn [AddEpAnn]
-> HsWildCardBndrs
     GhcPs (GenLocated (SrcSpanAnn AnnListItem) (HsSigType GhcPs))
-> Maybe (GenLocated (SrcSpanAnn NoEpAnns) DerivStrategy')
-> Maybe (GenLocated SrcSpanAnnP OverlapMode)
-> DerivDecl GhcPs
forall pass.
XCDerivDecl pass
-> LHsSigWcType pass
-> Maybe (LDerivStrategy pass)
-> Maybe (XRec pass OverlapMode)
-> DerivDecl pass
DerivDecl (GenLocated (SrcSpanAnn AnnListItem) (HsSigType GhcPs)
-> HsWildCardBndrs
     GhcPs (GenLocated (SrcSpanAnn AnnListItem) (HsSigType GhcPs))
hsWC (GenLocated (SrcSpanAnn AnnListItem) (HsSigType GhcPs)
 -> HsWildCardBndrs
      GhcPs (GenLocated (SrcSpanAnn AnnListItem) (HsSigType GhcPs)))
-> GenLocated (SrcSpanAnn AnnListItem) (HsSigType GhcPs)
-> HsWildCardBndrs
     GhcPs (GenLocated (SrcSpanAnn AnnListItem) (HsSigType GhcPs))
forall a b. (a -> b) -> a -> b
$ HsType' -> LHsSigType GhcPs
sigType HsType'
ty) ((DerivStrategy' -> GenLocated (SrcSpanAnn NoEpAnns) DerivStrategy')
-> Maybe DerivStrategy'
-> Maybe (GenLocated (SrcSpanAnn NoEpAnns) DerivStrategy')
forall a b. (a -> b) -> Maybe a -> Maybe b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap DerivStrategy' -> GenLocated (SrcSpanAnn NoEpAnns) DerivStrategy'
forall a ann. a -> GenLocated (SrcSpanAnn ann) a
mkLocated Maybe DerivStrategy'
way) Maybe (GenLocated SrcSpanAnnP OverlapMode)
forall a. Maybe a
Nothing
#else
          withEpAnnNotUsed DerivDecl (hsWC $ sigType ty) (fmap builtLoc way) Nothing
#endif
        hsWC :: GenLocated (SrcSpanAnn AnnListItem) (HsSigType GhcPs)
-> HsWildCardBndrs
     GhcPs (GenLocated (SrcSpanAnn AnnListItem) (HsSigType GhcPs))
hsWC =
#if MIN_VERSION_ghc(8,6,0)
          (NoExtField
 -> GenLocated (SrcSpanAnn AnnListItem) (HsSigType GhcPs)
 -> HsWildCardBndrs
      GhcPs (GenLocated (SrcSpanAnn AnnListItem) (HsSigType GhcPs)))
-> GenLocated (SrcSpanAnn AnnListItem) (HsSigType GhcPs)
-> HsWildCardBndrs
     GhcPs (GenLocated (SrcSpanAnn AnnListItem) (HsSigType GhcPs))
forall a. (NoExtField -> a) -> a
noExt XHsWC GhcPs (GenLocated (SrcSpanAnn AnnListItem) (HsSigType GhcPs))
-> GenLocated (SrcSpanAnn AnnListItem) (HsSigType GhcPs)
-> HsWildCardBndrs
     GhcPs (GenLocated (SrcSpanAnn AnnListItem) (HsSigType GhcPs))
NoExtField
-> GenLocated (SrcSpanAnn AnnListItem) (HsSigType GhcPs)
-> HsWildCardBndrs
     GhcPs (GenLocated (SrcSpanAnn AnnListItem) (HsSigType GhcPs))
forall pass thing.
XHsWC pass thing -> thing -> HsWildCardBndrs pass thing
HsWC
#else
          id
#endif

-- | Declares multiple pattern signatures of the same type.
--
-- > pattern F, G :: T
-- > =====
-- > patSynSigs ["F", "G"] $ var "T"
patSynSigs :: [OccNameStr] -> HsType' -> HsDecl'
patSynSigs :: [OccNameStr] -> HsType' -> HsDecl'
patSynSigs [OccNameStr]
names HsType'
t =
    Sig' -> HsDecl'
forall t. HasValBind t => Sig' -> t
sigB (Sig' -> HsDecl') -> Sig' -> HsDecl'
forall a b. (a -> b) -> a -> b
$ (EpAnn AnnSig -> [LocatedN RdrName] -> LHsSigType GhcPs -> Sig')
-> [LocatedN RdrName] -> LHsSigType GhcPs -> Sig'
forall ann a. (EpAnn ann -> a) -> a
withEpAnnNotUsed XPatSynSig GhcPs -> [LIdP GhcPs] -> LHsSigType GhcPs -> Sig'
EpAnn AnnSig -> [LocatedN RdrName] -> LHsSigType GhcPs -> Sig'
forall pass.
XPatSynSig pass -> [LIdP pass] -> LHsSigType pass -> Sig pass
PatSynSig ((OccNameStr -> LocatedN RdrName)
-> [OccNameStr] -> [LocatedN RdrName]
forall a b. (a -> b) -> [a] -> [b]
map (RdrNameStr -> LocatedN RdrName
typeRdrName (RdrNameStr -> LocatedN RdrName)
-> (OccNameStr -> RdrNameStr) -> OccNameStr -> LocatedN RdrName
forall b c a. (b -> c) -> (a -> b) -> a -> c
. OccNameStr -> RdrNameStr
unqual) [OccNameStr]
names)
        (LHsSigType GhcPs -> Sig') -> LHsSigType GhcPs -> Sig'
forall a b. (a -> b) -> a -> b
$ HsType' -> LHsSigType GhcPs
sigType HsType'
t

-- | Declares a pattern signature and its type.
--
-- > pattern F :: T
-- > =====
-- > patSynSigs "F" $ var "T"
patSynSig :: OccNameStr -> HsType' -> HsDecl'
patSynSig :: OccNameStr -> HsType' -> HsDecl'
patSynSig OccNameStr
n = [OccNameStr] -> HsType' -> HsDecl'
patSynSigs [OccNameStr
n]

-- TODO: patSynBidi, patSynUni

-- | Defines a pattern signature.
--
-- > pattern F a b = G b a
-- > =====
-- > patSynBind "F" ["a", "b"] $ conP "G" [bvar "b", bvar "a"]
patSynBind :: OccNameStr -> [OccNameStr] -> Pat' -> HsDecl'
patSynBind :: OccNameStr -> [OccNameStr] -> Pat' -> HsDecl'
patSynBind OccNameStr
n [OccNameStr]
ns Pat'
p = HsBind' -> HsDecl'
forall t. HasValBind t => HsBind' -> t
bindB (HsBind' -> HsDecl') -> HsBind' -> HsDecl'
forall a b. (a -> b) -> a -> b
$ (NoExtField -> PatSynBind GhcPs GhcPs -> HsBind')
-> PatSynBind GhcPs GhcPs -> HsBind'
forall a. (NoExtField -> a) -> a
noExt XPatSynBind GhcPs GhcPs -> PatSynBind GhcPs GhcPs -> HsBind'
NoExtField -> PatSynBind GhcPs GhcPs -> HsBind'
forall idL idR.
XPatSynBind idL idR -> PatSynBind idL idR -> HsBindLR idL idR
PatSynBind
                    (PatSynBind GhcPs GhcPs -> HsBind')
-> PatSynBind GhcPs GhcPs -> HsBind'
forall a b. (a -> b) -> a -> b
$ (HsConDetails Void (LocatedN RdrName) [RecordPatSynField GhcPs]
 -> GenLocated (SrcSpanAnn AnnListItem) Pat'
 -> HsPatSynDir GhcPs
 -> PatSynBind GhcPs GhcPs)
-> HsConDetails Void (LocatedN RdrName) [RecordPatSynField GhcPs]
-> GenLocated (SrcSpanAnn AnnListItem) Pat'
-> HsPatSynDir GhcPs
-> PatSynBind GhcPs GhcPs
forall a. a -> a
withPlaceHolder ((EpAnn [AddEpAnn]
 -> LocatedN RdrName
 -> HsConDetails Void (LocatedN RdrName) [RecordPatSynField GhcPs]
 -> GenLocated (SrcSpanAnn AnnListItem) Pat'
 -> HsPatSynDir GhcPs
 -> PatSynBind GhcPs GhcPs)
-> LocatedN RdrName
-> HsConDetails Void (LocatedN RdrName) [RecordPatSynField GhcPs]
-> GenLocated (SrcSpanAnn AnnListItem) Pat'
-> HsPatSynDir GhcPs
-> PatSynBind GhcPs GhcPs
forall ann a. (EpAnn ann -> a) -> a
withEpAnnNotUsed XPSB GhcPs GhcPs
-> LIdP GhcPs
-> HsPatSynDetails GhcPs
-> LPat GhcPs
-> HsPatSynDir GhcPs
-> PatSynBind GhcPs GhcPs
EpAnn [AddEpAnn]
-> LocatedN RdrName
-> HsConDetails Void (LocatedN RdrName) [RecordPatSynField GhcPs]
-> GenLocated (SrcSpanAnn AnnListItem) Pat'
-> HsPatSynDir GhcPs
-> PatSynBind GhcPs GhcPs
forall idL idR.
XPSB idL idR
-> LIdP idL
-> HsPatSynDetails idR
-> LPat idR
-> HsPatSynDir idR
-> PatSynBind idL idR
PSB (RdrNameStr -> LocatedN RdrName
valueRdrName (RdrNameStr -> LocatedN RdrName) -> RdrNameStr -> LocatedN RdrName
forall a b. (a -> b) -> a -> b
$ OccNameStr -> RdrNameStr
unqual OccNameStr
n))
                        ([LocatedN RdrName]
-> HsConDetails Void (LocatedN RdrName) [RecordPatSynField GhcPs]
forall {arg} {tyarg} {rec}. [arg] -> HsConDetails tyarg arg rec
prefixCon' ((OccNameStr -> LocatedN RdrName)
-> [OccNameStr] -> [LocatedN RdrName]
forall a b. (a -> b) -> [a] -> [b]
map (RdrNameStr -> LocatedN RdrName
valueRdrName (RdrNameStr -> LocatedN RdrName)
-> (OccNameStr -> RdrNameStr) -> OccNameStr -> LocatedN RdrName
forall b c a. (b -> c) -> (a -> b) -> a -> c
. OccNameStr -> RdrNameStr
unqual) [OccNameStr]
ns))
                        (Pat' -> LPat GhcPs
builtPat Pat'
p)
                        HsPatSynDir GhcPs
forall id. HsPatSynDir id
ImplicitBidirectional
  where
#if MIN_VERSION_ghc(9,2,0)
    prefixCon' :: [arg] -> HsConDetails tyarg arg rec
prefixCon' = [tyarg] -> [arg] -> HsConDetails tyarg arg rec
forall tyarg arg rec.
[tyarg] -> [arg] -> HsConDetails tyarg arg rec
PrefixCon []
#else
    prefixCon' = PrefixCon
#endif