-- 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 #-}
-- | This module provides combinators for constructing Haskell expressions.
module GHC.SourceGen.Expr
    ( HsExpr'
    , overLabel
    , let'
    , case'
    , lambda
    , lambdaCase
    , if'
    , multiIf
    , do'
    , listComp
    , Stmt'
    , (@::@)
    , tyApp
    , recordConE
    , recordUpd
    , from
    , fromThen
    , fromTo
    , fromThenTo
    ) where

import GHC.Hs.Expr
import GHC.Hs.Extension (GhcPs)
#if MIN_VERSION_ghc(9,6,0)
import GHC.Hs.Extension (noHsTok)
import GHC.Types.SourceText (SourceText(NoSourceText))
#endif
#if MIN_VERSION_ghc(9,4,0)
import GHC.Hs.Pat (HsFieldBind(..), HsRecFields(..))
#else
import GHC.Hs.Pat (HsRecField'(..), HsRecFields(..))
#endif
import GHC.Hs.Type (FieldOcc(..), AmbiguousFieldOcc(..))
import GHC.Hs.Utils (mkHsIf)
import Data.String (fromString)
#if MIN_VERSION_ghc(9,0,0)
import GHC.Types.SrcLoc (unLoc, GenLocated(..))
#else
import SrcLoc (unLoc, GenLocated(..))
#endif

#if MIN_VERSION_ghc(9,2,0)
import GHC.Parser.Annotation (EpAnn(..))
#endif

import GHC.SourceGen.Binds.Internal
import GHC.SourceGen.Binds
import GHC.SourceGen.Expr.Internal
import GHC.SourceGen.Name.Internal
import GHC.SourceGen.Syntax.Internal
import GHC.SourceGen.Type.Internal
    ( parenthesizeTypeForApp
    , sigWcType
    , wcType
    )

-- | An overloaded label, as used with the @OverloadedLabels@ extension.
--
-- > #foo
-- > =====
-- > overLabel "foo"
overLabel :: String -> HsExpr'
overLabel :: String -> HsExpr'
overLabel = FastString -> HsExpr'
hsOverLabel (FastString -> HsExpr')
-> (String -> FastString) -> String -> HsExpr'
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> FastString
forall a. IsString a => String -> a
fromString
  where
#if MIN_VERSION_ghc(9,6,0)
    hsOverLabel :: FastString -> HsExpr'
hsOverLabel = (EpAnn NoEpAnns -> SourceText -> FastString -> HsExpr')
-> SourceText -> FastString -> HsExpr'
forall ann a. (EpAnn ann -> a) -> a
withEpAnnNotUsed XOverLabel GhcPs -> SourceText -> FastString -> HsExpr'
EpAnn NoEpAnns -> SourceText -> FastString -> HsExpr'
forall p. XOverLabel p -> SourceText -> FastString -> HsExpr p
HsOverLabel SourceText
NoSourceText
#elif MIN_VERSION_ghc(9,2,0)
    hsOverLabel = withEpAnnNotUsed HsOverLabel
#else
    hsOverLabel = noExt HsOverLabel Nothing
#endif

let' :: [RawValBind] -> HsExpr' -> HsExpr'
#if MIN_VERSION_ghc(9,4,0)
let' :: [RawValBind] -> HsExpr' -> HsExpr'
let' [RawValBind]
binds HsExpr'
e = (EpAnn NoEpAnns
 -> GenLocated TokenLocation (HsToken "let")
 -> HsLocalBinds GhcPs
 -> GenLocated TokenLocation (HsToken "in")
 -> GenLocated (SrcSpanAnn AnnListItem) HsExpr'
 -> HsExpr')
-> GenLocated TokenLocation (HsToken "let")
-> HsLocalBinds GhcPs
-> GenLocated TokenLocation (HsToken "in")
-> GenLocated (SrcSpanAnn AnnListItem) HsExpr'
-> HsExpr'
forall ann a. (EpAnn ann -> a) -> a
withEpAnnNotUsed XLet GhcPs
-> LHsToken "let" GhcPs
-> HsLocalBinds GhcPs
-> LHsToken "in" GhcPs
-> LHsExpr GhcPs
-> HsExpr'
EpAnn NoEpAnns
-> GenLocated TokenLocation (HsToken "let")
-> HsLocalBinds GhcPs
-> GenLocated TokenLocation (HsToken "in")
-> GenLocated (SrcSpanAnn AnnListItem) HsExpr'
-> HsExpr'
forall p.
XLet p
-> LHsToken "let" p
-> HsLocalBinds p
-> LHsToken "in" p
-> LHsExpr p
-> HsExpr p
HsLet GenLocated TokenLocation (HsToken "let")
forall (t :: Symbol). GenLocated TokenLocation (HsToken t)
mkToken (HsLocalBinds GhcPs -> HsLocalBinds GhcPs
forall {a}. a -> a
toHsLocalBinds (HsLocalBinds GhcPs -> HsLocalBinds GhcPs)
-> HsLocalBinds GhcPs -> HsLocalBinds GhcPs
forall a b. (a -> b) -> a -> b
$ [RawValBind] -> HsLocalBinds GhcPs
valBinds [RawValBind]
binds) GenLocated TokenLocation (HsToken "in")
forall (t :: Symbol). GenLocated TokenLocation (HsToken t)
mkToken (GenLocated (SrcSpanAnn AnnListItem) HsExpr' -> HsExpr')
-> GenLocated (SrcSpanAnn AnnListItem) HsExpr' -> HsExpr'
forall a b. (a -> b) -> a -> b
$ HsExpr' -> GenLocated (SrcSpanAnn AnnListItem) HsExpr'
forall a ann. a -> GenLocated (SrcSpanAnn ann) a
mkLocated HsExpr'
e
#else
let' binds e = withEpAnnNotUsed HsLet (toHsLocalBinds $ valBinds binds) $ mkLocated e
#endif
  where
#if MIN_VERSION_ghc(9,2,0)
    toHsLocalBinds :: a -> a
toHsLocalBinds = a -> a
forall {a}. a -> a
id
#else
    toHsLocalBinds = builtLoc
#endif

case' :: HsExpr' -> [RawMatch] -> HsExpr'
case' :: HsExpr' -> [RawMatch] -> HsExpr'
case' HsExpr'
e [RawMatch]
matches = (EpAnn EpAnnHsCase
 -> GenLocated (SrcSpanAnn AnnListItem) HsExpr'
 -> MatchGroup' (LHsExpr GhcPs)
 -> HsExpr')
-> GenLocated (SrcSpanAnn AnnListItem) HsExpr'
-> MatchGroup' (LHsExpr GhcPs)
-> HsExpr'
forall ann a. (EpAnn ann -> a) -> a
withEpAnnNotUsed XCase GhcPs
-> LHsExpr GhcPs -> MatchGroup' (LHsExpr GhcPs) -> HsExpr'
EpAnn EpAnnHsCase
-> GenLocated (SrcSpanAnn AnnListItem) HsExpr'
-> MatchGroup' (LHsExpr GhcPs)
-> HsExpr'
forall p.
XCase p -> LHsExpr p -> MatchGroup p (LHsExpr p) -> HsExpr p
HsCase (HsExpr' -> GenLocated (SrcSpanAnn AnnListItem) HsExpr'
forall a ann. a -> GenLocated (SrcSpanAnn ann) a
mkLocated HsExpr'
e)
                    (MatchGroup' (LHsExpr GhcPs) -> HsExpr')
-> MatchGroup' (LHsExpr GhcPs) -> HsExpr'
forall a b. (a -> b) -> a -> b
$ HsMatchContext' -> [RawMatch] -> MatchGroup' (LHsExpr GhcPs)
matchGroup HsMatchContext'
forall p. HsMatchContext p
CaseAlt [RawMatch]
matches

lambda :: [Pat'] -> HsExpr' -> HsExpr'
lambda :: [Pat'] -> HsExpr' -> HsExpr'
lambda [Pat']
ps HsExpr'
e = (NoExtField -> MatchGroup' (LHsExpr GhcPs) -> HsExpr')
-> MatchGroup' (LHsExpr GhcPs) -> HsExpr'
forall a. (NoExtField -> a) -> a
noExt XLam GhcPs -> MatchGroup' (LHsExpr GhcPs) -> HsExpr'
NoExtField -> MatchGroup' (LHsExpr GhcPs) -> HsExpr'
forall p. XLam p -> MatchGroup p (LHsExpr p) -> HsExpr p
HsLam (MatchGroup' (LHsExpr GhcPs) -> HsExpr')
-> MatchGroup' (LHsExpr GhcPs) -> HsExpr'
forall a b. (a -> b) -> a -> b
$ HsMatchContext' -> [RawMatch] -> MatchGroup' (LHsExpr GhcPs)
matchGroup HsMatchContext'
forall p. HsMatchContext p
LambdaExpr [[Pat'] -> HsExpr' -> RawMatch
match [Pat']
ps HsExpr'
e]

lambdaCase :: [RawMatch] -> HsExpr'
#if MIN_VERSION_ghc(9,4,0)
lambdaCase :: [RawMatch] -> HsExpr'
lambdaCase = (EpAnn [AddEpAnn]
 -> LamCaseVariant
 -> MatchGroup GhcPs (GenLocated (SrcSpanAnn AnnListItem) HsExpr')
 -> HsExpr')
-> LamCaseVariant
-> MatchGroup GhcPs (GenLocated (SrcSpanAnn AnnListItem) HsExpr')
-> HsExpr'
forall ann a. (EpAnn ann -> a) -> a
withEpAnnNotUsed XLamCase GhcPs
-> LamCaseVariant -> MatchGroup' (LHsExpr GhcPs) -> HsExpr'
EpAnn [AddEpAnn]
-> LamCaseVariant
-> MatchGroup GhcPs (GenLocated (SrcSpanAnn AnnListItem) HsExpr')
-> HsExpr'
forall p.
XLamCase p
-> LamCaseVariant -> MatchGroup p (LHsExpr p) -> HsExpr p
HsLamCase LamCaseVariant
LamCase (MatchGroup GhcPs (GenLocated (SrcSpanAnn AnnListItem) HsExpr')
 -> HsExpr')
-> ([RawMatch]
    -> MatchGroup GhcPs (GenLocated (SrcSpanAnn AnnListItem) HsExpr'))
-> [RawMatch]
-> HsExpr'
forall b c a. (b -> c) -> (a -> b) -> a -> c
. HsMatchContext' -> [RawMatch] -> MatchGroup' (LHsExpr GhcPs)
matchGroup HsMatchContext'
forall p. HsMatchContext p
CaseAlt
#else
lambdaCase = withEpAnnNotUsed HsLamCase . matchGroup CaseAlt
#endif

if' :: HsExpr' -> HsExpr' -> HsExpr' -> HsExpr'
if' :: HsExpr' -> HsExpr' -> HsExpr' -> HsExpr'
if' HsExpr'
x HsExpr'
y HsExpr'
z = LHsExpr GhcPs
-> LHsExpr GhcPs -> LHsExpr GhcPs -> EpAnn AnnsIf -> HsExpr'
mkHsIf
                (HsExpr' -> GenLocated (SrcSpanAnn AnnListItem) HsExpr'
forall a ann. a -> GenLocated (SrcSpanAnn ann) a
mkLocated HsExpr'
x)
                (HsExpr' -> GenLocated (SrcSpanAnn AnnListItem) HsExpr'
forall a ann. a -> GenLocated (SrcSpanAnn ann) a
mkLocated HsExpr'
y)
                (HsExpr' -> GenLocated (SrcSpanAnn AnnListItem) HsExpr'
forall a ann. a -> GenLocated (SrcSpanAnn ann) a
mkLocated HsExpr'
z)
#if MIN_VERSION_ghc(9,2,0)
                EpAnn AnnsIf
forall ann. EpAnn ann
EpAnnNotUsed
#endif

-- | A MultiWayIf expression.
--
-- > if | f x = "f"
-- >    | g x = "g"
-- >    | otherwise = "h"
-- > =====
-- > multiIf
-- >     [ guardedStmt (var "f" @@ var "x") $ rhs (string "f")
-- >     , guardedStmt (var "g" @@ var "x") $ rhs (string "g")
-- >     , guardedStmt (var "otherwise") $ rhs (string "h")
-- >     ]
multiIf :: [GuardedExpr] -> HsExpr'
#if MIN_VERSION_ghc(9,4,0)
multiIf :: [GuardedExpr] -> HsExpr'
multiIf = ([GenLocated
    (SrcSpanAnn NoEpAnns)
    (GRHS' (GenLocated (SrcSpanAnn AnnListItem) HsExpr'))]
 -> HsExpr')
-> [GenLocated
      (SrcSpanAnn NoEpAnns)
      (GRHS' (GenLocated (SrcSpanAnn AnnListItem) HsExpr'))]
-> HsExpr'
forall {a}. a -> a
withPlaceHolder ((EpAnn [AddEpAnn]
 -> [GenLocated
       (SrcSpanAnn NoEpAnns)
       (GRHS' (GenLocated (SrcSpanAnn AnnListItem) HsExpr'))]
 -> HsExpr')
-> [GenLocated
      (SrcSpanAnn NoEpAnns)
      (GRHS' (GenLocated (SrcSpanAnn AnnListItem) HsExpr'))]
-> HsExpr'
forall ann a. (EpAnn ann -> a) -> a
withEpAnnNotUsed XMultiIf GhcPs -> [LGRHS GhcPs (LHsExpr GhcPs)] -> HsExpr'
EpAnn [AddEpAnn]
-> [GenLocated
      (SrcSpanAnn NoEpAnns)
      (GRHS' (GenLocated (SrcSpanAnn AnnListItem) HsExpr'))]
-> HsExpr'
forall p. XMultiIf p -> [LGRHS p (LHsExpr p)] -> HsExpr p
HsMultiIf) ([GenLocated
    (SrcSpanAnn NoEpAnns)
    (GRHS' (GenLocated (SrcSpanAnn AnnListItem) HsExpr'))]
 -> HsExpr')
-> ([GRHS' (GenLocated (SrcSpanAnn AnnListItem) HsExpr')]
    -> [GenLocated
          (SrcSpanAnn NoEpAnns)
          (GRHS' (GenLocated (SrcSpanAnn AnnListItem) HsExpr'))])
-> [GRHS' (GenLocated (SrcSpanAnn AnnListItem) HsExpr')]
-> HsExpr'
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (GRHS' (GenLocated (SrcSpanAnn AnnListItem) HsExpr')
 -> GenLocated
      (SrcSpanAnn NoEpAnns)
      (GRHS' (GenLocated (SrcSpanAnn AnnListItem) HsExpr')))
-> [GRHS' (GenLocated (SrcSpanAnn AnnListItem) HsExpr')]
-> [GenLocated
      (SrcSpanAnn NoEpAnns)
      (GRHS' (GenLocated (SrcSpanAnn AnnListItem) HsExpr'))]
forall a b. (a -> b) -> [a] -> [b]
map GRHS' (GenLocated (SrcSpanAnn AnnListItem) HsExpr')
-> GenLocated
     (SrcSpanAnn NoEpAnns)
     (GRHS' (GenLocated (SrcSpanAnn AnnListItem) HsExpr'))
forall a ann. a -> GenLocated (SrcSpanAnn ann) a
mkLocated
#else
multiIf = withPlaceHolder (withEpAnnNotUsed HsMultiIf) . map builtLoc
#endif

-- | A do-expression.
--
-- Individual statements may be constructed with '<--' and/or 'stmt'.
--
-- > do
-- >   x <- act
-- >   return x
-- > =====
-- > do' [bvar "x" <-- var "act", stmt $ var "return" @@ var "x"]
do' :: [Stmt'] -> HsExpr'
do' :: [Stmt'] -> HsExpr'
do' = HsExpr' -> HsExpr'
forall {a}. a -> a
withPlaceHolder
#if MIN_VERSION_ghc(9,0,0)
        (HsExpr' -> HsExpr')
-> ([StmtLR
       GhcPs GhcPs (GenLocated (SrcSpanAnn AnnListItem) HsExpr')]
    -> HsExpr')
-> [StmtLR
      GhcPs GhcPs (GenLocated (SrcSpanAnn AnnListItem) HsExpr')]
-> HsExpr'
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (EpAnn AnnList
 -> HsDoFlavour
 -> GenLocated
      (SrcSpanAnn AnnList)
      [GenLocated
         (SrcSpanAnn AnnListItem)
         (StmtLR GhcPs GhcPs (GenLocated (SrcSpanAnn AnnListItem) HsExpr'))]
 -> HsExpr')
-> HsDoFlavour
-> GenLocated
     (SrcSpanAnn AnnList)
     [GenLocated
        (SrcSpanAnn AnnListItem)
        (StmtLR GhcPs GhcPs (GenLocated (SrcSpanAnn AnnListItem) HsExpr'))]
-> HsExpr'
forall ann a. (EpAnn ann -> a) -> a
withEpAnnNotUsed XDo GhcPs -> HsDoFlavour -> XRec GhcPs [ExprLStmt GhcPs] -> HsExpr'
EpAnn AnnList
-> HsDoFlavour
-> GenLocated
     (SrcSpanAnn AnnList)
     [GenLocated
        (SrcSpanAnn AnnListItem)
        (StmtLR GhcPs GhcPs (GenLocated (SrcSpanAnn AnnListItem) HsExpr'))]
-> HsExpr'
forall p. XDo p -> HsDoFlavour -> XRec p [ExprLStmt p] -> HsExpr p
HsDo (Maybe ModuleName -> HsDoFlavour
DoExpr Maybe ModuleName
forall a. Maybe a
Nothing)
#else
        . noExt HsDo DoExpr
#endif
        (GenLocated
   (SrcSpanAnn AnnList)
   [GenLocated
      (SrcSpanAnn AnnListItem)
      (StmtLR GhcPs GhcPs (GenLocated (SrcSpanAnn AnnListItem) HsExpr'))]
 -> HsExpr')
-> ([StmtLR
       GhcPs GhcPs (GenLocated (SrcSpanAnn AnnListItem) HsExpr')]
    -> GenLocated
         (SrcSpanAnn AnnList)
         [GenLocated
            (SrcSpanAnn AnnListItem)
            (StmtLR
               GhcPs GhcPs (GenLocated (SrcSpanAnn AnnListItem) HsExpr'))])
-> [StmtLR
      GhcPs GhcPs (GenLocated (SrcSpanAnn AnnListItem) HsExpr')]
-> HsExpr'
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [GenLocated
   (SrcSpanAnn AnnListItem)
   (StmtLR GhcPs GhcPs (GenLocated (SrcSpanAnn AnnListItem) HsExpr'))]
-> GenLocated
     (SrcSpanAnn AnnList)
     [GenLocated
        (SrcSpanAnn AnnListItem)
        (StmtLR GhcPs GhcPs (GenLocated (SrcSpanAnn AnnListItem) HsExpr'))]
forall a ann. a -> GenLocated (SrcSpanAnn ann) a
mkLocated ([GenLocated
    (SrcSpanAnn AnnListItem)
    (StmtLR GhcPs GhcPs (GenLocated (SrcSpanAnn AnnListItem) HsExpr'))]
 -> GenLocated
      (SrcSpanAnn AnnList)
      [GenLocated
         (SrcSpanAnn AnnListItem)
         (StmtLR
            GhcPs GhcPs (GenLocated (SrcSpanAnn AnnListItem) HsExpr'))])
-> ([StmtLR
       GhcPs GhcPs (GenLocated (SrcSpanAnn AnnListItem) HsExpr')]
    -> [GenLocated
          (SrcSpanAnn AnnListItem)
          (StmtLR
             GhcPs GhcPs (GenLocated (SrcSpanAnn AnnListItem) HsExpr'))])
-> [StmtLR
      GhcPs GhcPs (GenLocated (SrcSpanAnn AnnListItem) HsExpr')]
-> GenLocated
     (SrcSpanAnn AnnList)
     [GenLocated
        (SrcSpanAnn AnnListItem)
        (StmtLR GhcPs GhcPs (GenLocated (SrcSpanAnn AnnListItem) HsExpr'))]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (StmtLR GhcPs GhcPs (GenLocated (SrcSpanAnn AnnListItem) HsExpr')
 -> GenLocated
      (SrcSpanAnn AnnListItem)
      (StmtLR GhcPs GhcPs (GenLocated (SrcSpanAnn AnnListItem) HsExpr')))
-> [StmtLR
      GhcPs GhcPs (GenLocated (SrcSpanAnn AnnListItem) HsExpr')]
-> [GenLocated
      (SrcSpanAnn AnnListItem)
      (StmtLR GhcPs GhcPs (GenLocated (SrcSpanAnn AnnListItem) HsExpr'))]
forall a b. (a -> b) -> [a] -> [b]
map (StmtLR GhcPs GhcPs (GenLocated (SrcSpanAnn AnnListItem) HsExpr')
-> GenLocated
     (SrcSpanAnn AnnListItem)
     (StmtLR GhcPs GhcPs (GenLocated (SrcSpanAnn AnnListItem) HsExpr'))
forall a ann. a -> GenLocated (SrcSpanAnn ann) a
mkLocated (StmtLR GhcPs GhcPs (GenLocated (SrcSpanAnn AnnListItem) HsExpr')
 -> GenLocated
      (SrcSpanAnn AnnListItem)
      (StmtLR GhcPs GhcPs (GenLocated (SrcSpanAnn AnnListItem) HsExpr')))
-> (StmtLR
      GhcPs GhcPs (GenLocated (SrcSpanAnn AnnListItem) HsExpr')
    -> StmtLR
         GhcPs GhcPs (GenLocated (SrcSpanAnn AnnListItem) HsExpr'))
-> StmtLR GhcPs GhcPs (GenLocated (SrcSpanAnn AnnListItem) HsExpr')
-> GenLocated
     (SrcSpanAnn AnnListItem)
     (StmtLR GhcPs GhcPs (GenLocated (SrcSpanAnn AnnListItem) HsExpr'))
forall b c a. (b -> c) -> (a -> b) -> a -> c
. StmtLR GhcPs GhcPs (GenLocated (SrcSpanAnn AnnListItem) HsExpr')
-> StmtLR GhcPs GhcPs (GenLocated (SrcSpanAnn AnnListItem) HsExpr')
forall {idL} {idR}.
StmtLR idL idR (GenLocated (SrcSpanAnn AnnListItem) HsExpr')
-> StmtLR idL idR (GenLocated (SrcSpanAnn AnnListItem) HsExpr')
parenthesizeIfLet)
  where
  -- Put parentheses around a "let" in a do-binding, to avoid:
  --   do let x = ...
  --      in x
  -- which is not valid Haskell.
#if MIN_VERSION_ghc(8,6,0)
    parenthesizeIfLet :: StmtLR idL idR (GenLocated (SrcSpanAnn AnnListItem) HsExpr')
-> StmtLR idL idR (GenLocated (SrcSpanAnn AnnListItem) HsExpr')
parenthesizeIfLet (BodyStmt XBodyStmt idL idR (GenLocated (SrcSpanAnn AnnListItem) HsExpr')
ext e :: GenLocated (SrcSpanAnn AnnListItem) HsExpr'
e@(L SrcSpanAnn AnnListItem
_ HsLet{}) SyntaxExpr idR
x SyntaxExpr idR
y)
        = XBodyStmt idL idR (GenLocated (SrcSpanAnn AnnListItem) HsExpr')
-> GenLocated (SrcSpanAnn AnnListItem) HsExpr'
-> SyntaxExpr idR
-> SyntaxExpr idR
-> StmtLR idL idR (GenLocated (SrcSpanAnn AnnListItem) HsExpr')
forall idL idR body.
XBodyStmt idL idR body
-> body -> SyntaxExpr idR -> SyntaxExpr idR -> StmtLR idL idR body
BodyStmt XBodyStmt idL idR (GenLocated (SrcSpanAnn AnnListItem) HsExpr')
ext (LHsExpr GhcPs -> LHsExpr GhcPs
parExpr LHsExpr GhcPs
GenLocated (SrcSpanAnn AnnListItem) HsExpr'
e) SyntaxExpr idR
x SyntaxExpr idR
y
#else
    parenthesizeIfLet (BodyStmt e@(L _ HsLet{}) x y tc)
        = BodyStmt (parExpr e) x y tc
#endif
    parenthesizeIfLet StmtLR idL idR (GenLocated (SrcSpanAnn AnnListItem) HsExpr')
s = StmtLR idL idR (GenLocated (SrcSpanAnn AnnListItem) HsExpr')
s

-- | A list comprehension expression.
--
-- > [x * 2 | x <- [1 .. 10], even x]
-- > =====
-- > listComp (op (bvar "x") "*" (int 2))
-- >          [ bvar "x" <-- fromTo (int 1) (int 10)
-- >          , stmt $ var "even" @@ bvar "x"
-- >          ]
listComp :: HsExpr' -> [Stmt'] -> HsExpr'
listComp :: HsExpr' -> [Stmt'] -> HsExpr'
listComp HsExpr'
lastExpr [Stmt']
stmts =
    let lastStmt :: StmtLR GhcPs GhcPs (GenLocated (SrcSpanAnn AnnListItem) HsExpr')
lastStmt = (NoExtField
 -> GenLocated (SrcSpanAnn AnnListItem) HsExpr'
 -> Maybe Bool
 -> SyntaxExpr GhcPs
 -> StmtLR
      GhcPs GhcPs (GenLocated (SrcSpanAnn AnnListItem) HsExpr'))
-> GenLocated (SrcSpanAnn AnnListItem) HsExpr'
-> Maybe Bool
-> SyntaxExpr GhcPs
-> StmtLR GhcPs GhcPs (GenLocated (SrcSpanAnn AnnListItem) HsExpr')
forall a. (NoExtField -> a) -> a
noExt XLastStmt GhcPs GhcPs (GenLocated (SrcSpanAnn AnnListItem) HsExpr')
-> GenLocated (SrcSpanAnn AnnListItem) HsExpr'
-> Maybe Bool
-> SyntaxExpr GhcPs
-> StmtLR GhcPs GhcPs (GenLocated (SrcSpanAnn AnnListItem) HsExpr')
NoExtField
-> GenLocated (SrcSpanAnn AnnListItem) HsExpr'
-> Maybe Bool
-> SyntaxExpr GhcPs
-> StmtLR GhcPs GhcPs (GenLocated (SrcSpanAnn AnnListItem) HsExpr')
forall idL idR body.
XLastStmt idL idR body
-> body -> Maybe Bool -> SyntaxExpr idR -> StmtLR idL idR body
LastStmt (HsExpr' -> GenLocated (SrcSpanAnn AnnListItem) HsExpr'
forall a ann. a -> GenLocated (SrcSpanAnn ann) a
mkLocated HsExpr'
lastExpr) Maybe Bool
forall a. Maybe a
ret SyntaxExpr GhcPs
forall (p :: Pass). IsPass p => SyntaxExpr (GhcPass p)
noSyntaxExpr
#if MIN_VERSION_ghc(9,0,0)
        ret :: Maybe a
ret = Maybe a
forall a. Maybe a
Nothing
#else
        ret = False
#endif
     in HsExpr' -> HsExpr'
forall {a}. a -> a
withPlaceHolder (HsExpr' -> HsExpr')
-> ([StmtLR
       GhcPs GhcPs (GenLocated (SrcSpanAnn AnnListItem) HsExpr')]
    -> HsExpr')
-> [StmtLR
      GhcPs GhcPs (GenLocated (SrcSpanAnn AnnListItem) HsExpr')]
-> HsExpr'
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (EpAnn AnnList
 -> HsDoFlavour
 -> GenLocated
      (SrcSpanAnn AnnList)
      [GenLocated
         (SrcSpanAnn AnnListItem)
         (StmtLR GhcPs GhcPs (GenLocated (SrcSpanAnn AnnListItem) HsExpr'))]
 -> HsExpr')
-> HsDoFlavour
-> GenLocated
     (SrcSpanAnn AnnList)
     [GenLocated
        (SrcSpanAnn AnnListItem)
        (StmtLR GhcPs GhcPs (GenLocated (SrcSpanAnn AnnListItem) HsExpr'))]
-> HsExpr'
forall ann a. (EpAnn ann -> a) -> a
withEpAnnNotUsed XDo GhcPs -> HsDoFlavour -> XRec GhcPs [ExprLStmt GhcPs] -> HsExpr'
EpAnn AnnList
-> HsDoFlavour
-> GenLocated
     (SrcSpanAnn AnnList)
     [GenLocated
        (SrcSpanAnn AnnListItem)
        (StmtLR GhcPs GhcPs (GenLocated (SrcSpanAnn AnnListItem) HsExpr'))]
-> HsExpr'
forall p. XDo p -> HsDoFlavour -> XRec p [ExprLStmt p] -> HsExpr p
HsDo HsDoFlavour
ListComp (GenLocated
   (SrcSpanAnn AnnList)
   [GenLocated
      (SrcSpanAnn AnnListItem)
      (StmtLR GhcPs GhcPs (GenLocated (SrcSpanAnn AnnListItem) HsExpr'))]
 -> HsExpr')
-> ([StmtLR
       GhcPs GhcPs (GenLocated (SrcSpanAnn AnnListItem) HsExpr')]
    -> GenLocated
         (SrcSpanAnn AnnList)
         [GenLocated
            (SrcSpanAnn AnnListItem)
            (StmtLR
               GhcPs GhcPs (GenLocated (SrcSpanAnn AnnListItem) HsExpr'))])
-> [StmtLR
      GhcPs GhcPs (GenLocated (SrcSpanAnn AnnListItem) HsExpr')]
-> HsExpr'
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [GenLocated
   (SrcSpanAnn AnnListItem)
   (StmtLR GhcPs GhcPs (GenLocated (SrcSpanAnn AnnListItem) HsExpr'))]
-> GenLocated
     (SrcSpanAnn AnnList)
     [GenLocated
        (SrcSpanAnn AnnListItem)
        (StmtLR GhcPs GhcPs (GenLocated (SrcSpanAnn AnnListItem) HsExpr'))]
forall a ann. a -> GenLocated (SrcSpanAnn ann) a
mkLocated ([GenLocated
    (SrcSpanAnn AnnListItem)
    (StmtLR GhcPs GhcPs (GenLocated (SrcSpanAnn AnnListItem) HsExpr'))]
 -> GenLocated
      (SrcSpanAnn AnnList)
      [GenLocated
         (SrcSpanAnn AnnListItem)
         (StmtLR
            GhcPs GhcPs (GenLocated (SrcSpanAnn AnnListItem) HsExpr'))])
-> ([StmtLR
       GhcPs GhcPs (GenLocated (SrcSpanAnn AnnListItem) HsExpr')]
    -> [GenLocated
          (SrcSpanAnn AnnListItem)
          (StmtLR
             GhcPs GhcPs (GenLocated (SrcSpanAnn AnnListItem) HsExpr'))])
-> [StmtLR
      GhcPs GhcPs (GenLocated (SrcSpanAnn AnnListItem) HsExpr')]
-> GenLocated
     (SrcSpanAnn AnnList)
     [GenLocated
        (SrcSpanAnn AnnListItem)
        (StmtLR GhcPs GhcPs (GenLocated (SrcSpanAnn AnnListItem) HsExpr'))]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (StmtLR GhcPs GhcPs (GenLocated (SrcSpanAnn AnnListItem) HsExpr')
 -> GenLocated
      (SrcSpanAnn AnnListItem)
      (StmtLR GhcPs GhcPs (GenLocated (SrcSpanAnn AnnListItem) HsExpr')))
-> [StmtLR
      GhcPs GhcPs (GenLocated (SrcSpanAnn AnnListItem) HsExpr')]
-> [GenLocated
      (SrcSpanAnn AnnListItem)
      (StmtLR GhcPs GhcPs (GenLocated (SrcSpanAnn AnnListItem) HsExpr'))]
forall a b. (a -> b) -> [a] -> [b]
map StmtLR GhcPs GhcPs (GenLocated (SrcSpanAnn AnnListItem) HsExpr')
-> GenLocated
     (SrcSpanAnn AnnListItem)
     (StmtLR GhcPs GhcPs (GenLocated (SrcSpanAnn AnnListItem) HsExpr'))
forall a ann. a -> GenLocated (SrcSpanAnn ann) a
mkLocated ([StmtLR GhcPs GhcPs (GenLocated (SrcSpanAnn AnnListItem) HsExpr')]
 -> HsExpr')
-> [StmtLR
      GhcPs GhcPs (GenLocated (SrcSpanAnn AnnListItem) HsExpr')]
-> HsExpr'
forall a b. (a -> b) -> a -> b
$
            [Stmt']
[StmtLR GhcPs GhcPs (GenLocated (SrcSpanAnn AnnListItem) HsExpr')]
stmts [StmtLR GhcPs GhcPs (GenLocated (SrcSpanAnn AnnListItem) HsExpr')]
-> [StmtLR
      GhcPs GhcPs (GenLocated (SrcSpanAnn AnnListItem) HsExpr')]
-> [StmtLR
      GhcPs GhcPs (GenLocated (SrcSpanAnn AnnListItem) HsExpr')]
forall a. [a] -> [a] -> [a]
++ [StmtLR GhcPs GhcPs (GenLocated (SrcSpanAnn AnnListItem) HsExpr')
lastStmt]

-- | A type constraint on an expression.
--
-- > e :: t
-- > =====
-- > var "e" @::@ var "t"
(@::@) :: HsExpr' -> HsType' -> HsExpr'
#if MIN_VERSION_ghc(8,8,0)
HsExpr'
e @::@ :: HsExpr' -> HsType' -> HsExpr'
@::@ HsType'
t = (EpAnn [AddEpAnn]
 -> GenLocated (SrcSpanAnn AnnListItem) HsExpr'
 -> HsWildCardBndrs
      GhcPs (GenLocated (SrcSpanAnn AnnListItem) (HsSigType GhcPs))
 -> HsExpr')
-> GenLocated (SrcSpanAnn AnnListItem) HsExpr'
-> HsWildCardBndrs
     GhcPs (GenLocated (SrcSpanAnn AnnListItem) (HsSigType GhcPs))
-> HsExpr'
forall ann a. (EpAnn ann -> a) -> a
withEpAnnNotUsed XExprWithTySig GhcPs
-> LHsExpr GhcPs -> LHsSigWcType (NoGhcTc GhcPs) -> HsExpr'
EpAnn [AddEpAnn]
-> GenLocated (SrcSpanAnn AnnListItem) HsExpr'
-> HsWildCardBndrs
     GhcPs (GenLocated (SrcSpanAnn AnnListItem) (HsSigType GhcPs))
-> HsExpr'
forall p.
XExprWithTySig p
-> LHsExpr p -> LHsSigWcType (NoGhcTc p) -> HsExpr p
ExprWithTySig (HsExpr' -> GenLocated (SrcSpanAnn AnnListItem) HsExpr'
forall a ann. a -> GenLocated (SrcSpanAnn ann) a
mkLocated HsExpr'
e) (HsType' -> LHsSigWcType'
sigWcType HsType'
t)
#elif MIN_VERSION_ghc(8,6,0)
e @::@ t = ExprWithTySig (sigWcType t) (builtLoc e)
#else
e @::@ t = ExprWithTySig (builtLoc e) (sigWcType t)
#endif
-- TODO: The Outputable instance prepends extra spaces; I'm not sure why.

-- | Explicit type application.
--
-- > f @ Int
-- > =====
-- > var "f" @@ var "Int"
tyApp :: HsExpr' -> HsType' -> HsExpr'
#if MIN_VERSION_ghc(9,6,0)
tyApp :: HsExpr' -> HsType' -> HsExpr'
tyApp HsExpr'
e HsType'
t = (NoExtField
 -> GenLocated (SrcSpanAnn AnnListItem) HsExpr'
 -> GenLocated TokenLocation (HsToken "@")
 -> HsWildCardBndrs
      GhcPs (GenLocated (SrcSpanAnn AnnListItem) HsType')
 -> HsExpr')
-> GenLocated (SrcSpanAnn AnnListItem) HsExpr'
-> GenLocated TokenLocation (HsToken "@")
-> HsWildCardBndrs
     GhcPs (GenLocated (SrcSpanAnn AnnListItem) HsType')
-> HsExpr'
forall a. (NoExtField -> a) -> a
noExt XAppTypeE GhcPs
-> LHsExpr GhcPs
-> LHsToken "@" GhcPs
-> LHsWcType (NoGhcTc GhcPs)
-> HsExpr'
NoExtField
-> GenLocated (SrcSpanAnn AnnListItem) HsExpr'
-> GenLocated TokenLocation (HsToken "@")
-> HsWildCardBndrs
     GhcPs (GenLocated (SrcSpanAnn AnnListItem) HsType')
-> HsExpr'
forall p.
XAppTypeE p
-> LHsExpr p -> LHsToken "@" p -> LHsWcType (NoGhcTc p) -> HsExpr p
HsAppType GenLocated (SrcSpanAnn AnnListItem) HsExpr'
forall {ann}. GenLocated (SrcSpanAnn ann) HsExpr'
e' GenLocated TokenLocation (HsToken "@")
forall (t :: Symbol). GenLocated TokenLocation (HsToken t)
noHsTok HsWildCardBndrs GhcPs (GenLocated (SrcSpanAnn AnnListItem) HsType')
t'
#elif MIN_VERSION_ghc(9,2,0)
tyApp e t = HsAppType builtSpan e' t'
#elif MIN_VERSION_ghc(8,8,0)
tyApp e t = noExt HsAppType e' t'
#elif MIN_VERSION_ghc(8,6,0)
tyApp e t = HsAppType t' e'
#else
tyApp e t = HsAppType e' t'
#endif
  where
    t' :: LHsWcType'
t' = HsType' -> LHsWcType'
wcType (HsType' -> LHsWcType') -> HsType' -> LHsWcType'
forall a b. (a -> b) -> a -> b
$ GenLocated (SrcSpanAnn AnnListItem) HsType' -> HsType'
forall l e. GenLocated l e -> e
unLoc (GenLocated (SrcSpanAnn AnnListItem) HsType' -> HsType')
-> GenLocated (SrcSpanAnn AnnListItem) HsType' -> HsType'
forall a b. (a -> b) -> a -> b
$ LHsType GhcPs -> LHsType GhcPs
parenthesizeTypeForApp (LHsType GhcPs -> LHsType GhcPs) -> LHsType GhcPs -> LHsType GhcPs
forall a b. (a -> b) -> a -> b
$ HsType' -> GenLocated (SrcSpanAnn AnnListItem) HsType'
forall a ann. a -> GenLocated (SrcSpanAnn ann) a
mkLocated HsType'
t
    e' :: GenLocated (SrcSpanAnn ann) HsExpr'
e' = HsExpr' -> GenLocated (SrcSpanAnn ann) HsExpr'
forall a ann. a -> GenLocated (SrcSpanAnn ann) a
mkLocated HsExpr'
e

-- | Constructs a record with explicit field names.
--
-- > A { x = y }
-- > =====
-- > recordConE "A" [("x", var "y")]
recordConE :: RdrNameStr -> [(RdrNameStr, HsExpr')] -> HsExpr'
recordConE :: RdrNameStr -> [(RdrNameStr, HsExpr')] -> HsExpr'
recordConE RdrNameStr
c [(RdrNameStr, HsExpr')]
fs = ((HsRecFields GhcPs (GenLocated (SrcSpanAnn AnnListItem) HsExpr')
 -> HsExpr')
-> HsRecFields GhcPs (GenLocated (SrcSpanAnn AnnListItem) HsExpr')
-> HsExpr'
forall {a}. a -> a
withPlaceHolder ((HsRecFields GhcPs (GenLocated (SrcSpanAnn AnnListItem) HsExpr')
  -> HsExpr')
 -> HsRecFields GhcPs (GenLocated (SrcSpanAnn AnnListItem) HsExpr')
 -> HsExpr')
-> (HsRecFields GhcPs (GenLocated (SrcSpanAnn AnnListItem) HsExpr')
    -> HsExpr')
-> HsRecFields GhcPs (GenLocated (SrcSpanAnn AnnListItem) HsExpr')
-> HsExpr'
forall a b. (a -> b) -> a -> b
$ (EpAnn [AddEpAnn]
 -> LocatedN RdrName
 -> HsRecFields GhcPs (GenLocated (SrcSpanAnn AnnListItem) HsExpr')
 -> HsExpr')
-> LocatedN RdrName
-> HsRecFields GhcPs (GenLocated (SrcSpanAnn AnnListItem) HsExpr')
-> HsExpr'
forall ann a. (EpAnn ann -> a) -> a
withEpAnnNotUsed XRecordCon GhcPs
-> XRec GhcPs (ConLikeP GhcPs) -> HsRecordBinds GhcPs -> HsExpr'
EpAnn [AddEpAnn]
-> LocatedN RdrName
-> HsRecFields GhcPs (GenLocated (SrcSpanAnn AnnListItem) HsExpr')
-> HsExpr'
forall p.
XRecordCon p -> XRec p (ConLikeP p) -> HsRecordBinds p -> HsExpr p
RecordCon (RdrNameStr -> LocatedN RdrName
valueRdrName RdrNameStr
c))
#if !MIN_VERSION_ghc(8,6,0)
                    noPostTcExpr
#endif
                    (HsRecFields GhcPs (GenLocated (SrcSpanAnn AnnListItem) HsExpr')
 -> HsExpr')
-> HsRecFields GhcPs (GenLocated (SrcSpanAnn AnnListItem) HsExpr')
-> HsExpr'
forall a b. (a -> b) -> a -> b
$ [LHsRecField GhcPs (GenLocated (SrcSpanAnn AnnListItem) HsExpr')]
-> Maybe (XRec GhcPs RecFieldsDotDot)
-> HsRecFields GhcPs (GenLocated (SrcSpanAnn AnnListItem) HsExpr')
forall p arg.
[LHsRecField p arg]
-> Maybe (XRec p RecFieldsDotDot) -> HsRecFields p arg
HsRecFields (((RdrNameStr, HsExpr')
 -> GenLocated
      (SrcSpanAnn AnnListItem)
      (HsFieldBind
         (GenLocated (SrcSpanAnn NoEpAnns) (FieldOcc GhcPs))
         (GenLocated (SrcSpanAnn AnnListItem) HsExpr')))
-> [(RdrNameStr, HsExpr')]
-> [GenLocated
      (SrcSpanAnn AnnListItem)
      (HsFieldBind
         (GenLocated (SrcSpanAnn NoEpAnns) (FieldOcc GhcPs))
         (GenLocated (SrcSpanAnn AnnListItem) HsExpr'))]
forall a b. (a -> b) -> [a] -> [b]
map (RdrNameStr, HsExpr') -> LHsRecField' (LHsExpr GhcPs)
(RdrNameStr, HsExpr')
-> GenLocated
     (SrcSpanAnn AnnListItem)
     (HsFieldBind
        (GenLocated (SrcSpanAnn NoEpAnns) (FieldOcc GhcPs))
        (GenLocated (SrcSpanAnn AnnListItem) HsExpr'))
recField [(RdrNameStr, HsExpr')]
fs)
                        Maybe (XRec GhcPs RecFieldsDotDot)
Maybe (GenLocated SrcSpan RecFieldsDotDot)
forall a. Maybe a
Nothing -- No ".."
  where
    recField :: (RdrNameStr, HsExpr') -> LHsRecField' LHsExpr'
    recField :: (RdrNameStr, HsExpr') -> LHsRecField' (LHsExpr GhcPs)
recField (RdrNameStr
f, HsExpr'
e) =
#if MIN_VERSION_ghc(9,4,0)
        HsFieldBind
  (GenLocated (SrcSpanAnn NoEpAnns) (FieldOcc GhcPs))
  (GenLocated (SrcSpanAnn AnnListItem) HsExpr')
-> GenLocated
     (SrcSpanAnn AnnListItem)
     (HsFieldBind
        (GenLocated (SrcSpanAnn NoEpAnns) (FieldOcc GhcPs))
        (GenLocated (SrcSpanAnn AnnListItem) HsExpr'))
forall a ann. a -> GenLocated (SrcSpanAnn ann) a
mkLocated HsFieldBind
            { hfbLHS :: GenLocated (SrcSpanAnn NoEpAnns) (FieldOcc GhcPs)
hfbLHS =
                  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
f
            , hfbRHS :: GenLocated (SrcSpanAnn AnnListItem) HsExpr'
hfbRHS = HsExpr' -> GenLocated (SrcSpanAnn AnnListItem) HsExpr'
forall a ann. a -> GenLocated (SrcSpanAnn ann) a
mkLocated HsExpr'
e
            , hfbPun :: Bool
hfbPun = Bool
False
            , hfbAnn :: XHsFieldBind (GenLocated (SrcSpanAnn NoEpAnns) (FieldOcc GhcPs))
hfbAnn = XHsFieldBind (GenLocated (SrcSpanAnn NoEpAnns) (FieldOcc GhcPs))
EpAnn [AddEpAnn]
forall ann. EpAnn ann
EpAnnNotUsed
#else
        mkLocated HsRecField
            { hsRecFieldLbl =
                  builtLoc $ withPlaceHolder $ noExt FieldOcc $ valueRdrName f
            , hsRecFieldArg = mkLocated e
            , hsRecPun = False
#if MIN_VERSION_ghc(9,2,0)
            , hsRecFieldAnn = EpAnnNotUsed
#endif
#endif
            }

-- | Updates a record expression with explicit field names.
--
-- > r {a = b, c = d}
-- > =====
-- > recordUpd (var "x") [("a", var "b", ("c", var "d"))]
--
-- > (f x) {a = b}
-- > =====
-- > recordUpd (var "f" @@ var "x") [("a", var "b")]
--
-- > f x {a = b} -- equivalent to f (x {a = b})
-- > =====
-- > var "f" @@ recordUpd (var "x") [("a", var "b")]
recordUpd :: HsExpr' -> [(RdrNameStr, HsExpr')] -> HsExpr'
recordUpd :: HsExpr' -> [(RdrNameStr, HsExpr')] -> HsExpr'
recordUpd HsExpr'
e [(RdrNameStr, HsExpr')]
fs =
    HsExpr' -> HsExpr'
forall {a}. a -> a
withPlaceHolder4
       (HsExpr' -> HsExpr') -> HsExpr' -> HsExpr'
forall a b. (a -> b) -> a -> b
$ (EpAnn [AddEpAnn]
 -> GenLocated (SrcSpanAnn AnnListItem) HsExpr'
 -> Either
      [GenLocated
         (SrcSpanAnn AnnListItem)
         (HsFieldBind
            (GenLocated (SrcSpanAnn NoEpAnns) (AmbiguousFieldOcc GhcPs))
            (GenLocated (SrcSpanAnn AnnListItem) HsExpr'))]
      [GenLocated
         (SrcSpanAnn AnnListItem)
         (HsFieldBind
            (GenLocated (SrcSpanAnn NoEpAnns) (FieldLabelStrings GhcPs))
            (GenLocated (SrcSpanAnn AnnListItem) HsExpr'))]
 -> HsExpr')
-> GenLocated (SrcSpanAnn AnnListItem) HsExpr'
-> Either
     [GenLocated
        (SrcSpanAnn AnnListItem)
        (HsFieldBind
           (GenLocated (SrcSpanAnn NoEpAnns) (AmbiguousFieldOcc GhcPs))
           (GenLocated (SrcSpanAnn AnnListItem) HsExpr'))]
     [GenLocated
        (SrcSpanAnn AnnListItem)
        (HsFieldBind
           (GenLocated (SrcSpanAnn NoEpAnns) (FieldLabelStrings GhcPs))
           (GenLocated (SrcSpanAnn AnnListItem) HsExpr'))]
-> HsExpr'
forall ann a. (EpAnn ann -> a) -> a
withEpAnnNotUsed XRecordUpd GhcPs
-> LHsExpr GhcPs
-> Either [LHsRecUpdField GhcPs] [LHsRecUpdProj GhcPs]
-> HsExpr'
EpAnn [AddEpAnn]
-> GenLocated (SrcSpanAnn AnnListItem) HsExpr'
-> Either
     [GenLocated
        (SrcSpanAnn AnnListItem)
        (HsFieldBind
           (GenLocated (SrcSpanAnn NoEpAnns) (AmbiguousFieldOcc GhcPs))
           (GenLocated (SrcSpanAnn AnnListItem) HsExpr'))]
     [GenLocated
        (SrcSpanAnn AnnListItem)
        (HsFieldBind
           (GenLocated (SrcSpanAnn NoEpAnns) (FieldLabelStrings GhcPs))
           (GenLocated (SrcSpanAnn AnnListItem) HsExpr'))]
-> HsExpr'
forall p.
XRecordUpd p
-> LHsExpr p
-> Either [LHsRecUpdField p] [LHsRecUpdProj p]
-> HsExpr p
RecordUpd (LHsExpr GhcPs -> LHsExpr GhcPs
parenthesizeExprForApp (LHsExpr GhcPs -> LHsExpr GhcPs) -> LHsExpr GhcPs -> LHsExpr GhcPs
forall a b. (a -> b) -> a -> b
$ HsExpr' -> GenLocated (SrcSpanAnn AnnListItem) HsExpr'
forall a ann. a -> GenLocated (SrcSpanAnn ann) a
mkLocated HsExpr'
e)
       (Either
   [GenLocated
      (SrcSpanAnn AnnListItem)
      (HsFieldBind
         (GenLocated (SrcSpanAnn NoEpAnns) (AmbiguousFieldOcc GhcPs))
         (GenLocated (SrcSpanAnn AnnListItem) HsExpr'))]
   [GenLocated
      (SrcSpanAnn AnnListItem)
      (HsFieldBind
         (GenLocated (SrcSpanAnn NoEpAnns) (FieldLabelStrings GhcPs))
         (GenLocated (SrcSpanAnn AnnListItem) HsExpr'))]
 -> HsExpr')
-> Either
     [GenLocated
        (SrcSpanAnn AnnListItem)
        (HsFieldBind
           (GenLocated (SrcSpanAnn NoEpAnns) (AmbiguousFieldOcc GhcPs))
           (GenLocated (SrcSpanAnn AnnListItem) HsExpr'))]
     [GenLocated
        (SrcSpanAnn AnnListItem)
        (HsFieldBind
           (GenLocated (SrcSpanAnn NoEpAnns) (FieldLabelStrings GhcPs))
           (GenLocated (SrcSpanAnn AnnListItem) HsExpr'))]
-> HsExpr'
forall a b. (a -> b) -> a -> b
$ [GenLocated
   (SrcSpanAnn AnnListItem)
   (HsFieldBind
      (GenLocated (SrcSpanAnn NoEpAnns) (AmbiguousFieldOcc GhcPs))
      (GenLocated (SrcSpanAnn AnnListItem) HsExpr'))]
-> Either
     [GenLocated
        (SrcSpanAnn AnnListItem)
        (HsFieldBind
           (GenLocated (SrcSpanAnn NoEpAnns) (AmbiguousFieldOcc GhcPs))
           (GenLocated (SrcSpanAnn AnnListItem) HsExpr'))]
     [GenLocated
        (SrcSpanAnn AnnListItem)
        (HsFieldBind
           (GenLocated (SrcSpanAnn NoEpAnns) (FieldLabelStrings GhcPs))
           (GenLocated (SrcSpanAnn AnnListItem) HsExpr'))]
forall {a} {b}. a -> Either a b
toRecordUpdFields ([GenLocated
    (SrcSpanAnn AnnListItem)
    (HsFieldBind
       (GenLocated (SrcSpanAnn NoEpAnns) (AmbiguousFieldOcc GhcPs))
       (GenLocated (SrcSpanAnn AnnListItem) HsExpr'))]
 -> Either
      [GenLocated
         (SrcSpanAnn AnnListItem)
         (HsFieldBind
            (GenLocated (SrcSpanAnn NoEpAnns) (AmbiguousFieldOcc GhcPs))
            (GenLocated (SrcSpanAnn AnnListItem) HsExpr'))]
      [GenLocated
         (SrcSpanAnn AnnListItem)
         (HsFieldBind
            (GenLocated (SrcSpanAnn NoEpAnns) (FieldLabelStrings GhcPs))
            (GenLocated (SrcSpanAnn AnnListItem) HsExpr'))])
-> [GenLocated
      (SrcSpanAnn AnnListItem)
      (HsFieldBind
         (GenLocated (SrcSpanAnn NoEpAnns) (AmbiguousFieldOcc GhcPs))
         (GenLocated (SrcSpanAnn AnnListItem) HsExpr'))]
-> Either
     [GenLocated
        (SrcSpanAnn AnnListItem)
        (HsFieldBind
           (GenLocated (SrcSpanAnn NoEpAnns) (AmbiguousFieldOcc GhcPs))
           (GenLocated (SrcSpanAnn AnnListItem) HsExpr'))]
     [GenLocated
        (SrcSpanAnn AnnListItem)
        (HsFieldBind
           (GenLocated (SrcSpanAnn NoEpAnns) (FieldLabelStrings GhcPs))
           (GenLocated (SrcSpanAnn AnnListItem) HsExpr'))]
forall a b. (a -> b) -> a -> b
$ ((RdrNameStr, HsExpr')
 -> GenLocated
      (SrcSpanAnn AnnListItem)
      (HsFieldBind
         (GenLocated (SrcSpanAnn NoEpAnns) (AmbiguousFieldOcc GhcPs))
         (GenLocated (SrcSpanAnn AnnListItem) HsExpr')))
-> [(RdrNameStr, HsExpr')]
-> [GenLocated
      (SrcSpanAnn AnnListItem)
      (HsFieldBind
         (GenLocated (SrcSpanAnn NoEpAnns) (AmbiguousFieldOcc GhcPs))
         (GenLocated (SrcSpanAnn AnnListItem) HsExpr'))]
forall a b. (a -> b) -> [a] -> [b]
map (RdrNameStr, HsExpr') -> LHsRecUpdField GhcPs
(RdrNameStr, HsExpr')
-> GenLocated
     (SrcSpanAnn AnnListItem)
     (HsFieldBind
        (GenLocated (SrcSpanAnn NoEpAnns) (AmbiguousFieldOcc GhcPs))
        (GenLocated (SrcSpanAnn AnnListItem) HsExpr'))
mkField [(RdrNameStr, HsExpr')]
fs
  where
    mkField :: (RdrNameStr, HsExpr') -> LHsRecUpdField'
    mkField :: (RdrNameStr, HsExpr') -> LHsRecUpdField GhcPs
mkField (RdrNameStr
f, HsExpr'
e') =
#if MIN_VERSION_ghc(9,4,0)
        HsFieldBind
  (GenLocated (SrcSpanAnn NoEpAnns) (AmbiguousFieldOcc GhcPs))
  (GenLocated (SrcSpanAnn AnnListItem) HsExpr')
-> GenLocated
     (SrcSpanAnn AnnListItem)
     (HsFieldBind
        (GenLocated (SrcSpanAnn NoEpAnns) (AmbiguousFieldOcc GhcPs))
        (GenLocated (SrcSpanAnn AnnListItem) HsExpr'))
forall a ann. a -> GenLocated (SrcSpanAnn ann) a
mkLocated HsFieldBind
            { hfbLHS :: GenLocated (SrcSpanAnn NoEpAnns) (AmbiguousFieldOcc GhcPs)
hfbLHS =
                AmbiguousFieldOcc GhcPs
-> GenLocated (SrcSpanAnn NoEpAnns) (AmbiguousFieldOcc GhcPs)
forall a ann. a -> GenLocated (SrcSpanAnn ann) a
mkLocated (AmbiguousFieldOcc GhcPs
 -> GenLocated (SrcSpanAnn NoEpAnns) (AmbiguousFieldOcc GhcPs))
-> AmbiguousFieldOcc GhcPs
-> GenLocated (SrcSpanAnn NoEpAnns) (AmbiguousFieldOcc GhcPs)
forall a b. (a -> b) -> a -> b
$ AmbiguousFieldOcc GhcPs -> AmbiguousFieldOcc GhcPs
forall {a}. a -> a
withPlaceHolder (AmbiguousFieldOcc GhcPs -> AmbiguousFieldOcc GhcPs)
-> AmbiguousFieldOcc GhcPs -> AmbiguousFieldOcc GhcPs
forall a b. (a -> b) -> a -> b
$ (NoExtField -> LocatedN RdrName -> AmbiguousFieldOcc GhcPs)
-> LocatedN RdrName -> AmbiguousFieldOcc GhcPs
forall a. (NoExtField -> a) -> a
noExt XAmbiguous GhcPs -> XRec GhcPs RdrName -> AmbiguousFieldOcc GhcPs
NoExtField -> LocatedN RdrName -> AmbiguousFieldOcc GhcPs
forall pass.
XAmbiguous pass -> XRec pass RdrName -> AmbiguousFieldOcc pass
Ambiguous (LocatedN RdrName -> AmbiguousFieldOcc GhcPs)
-> LocatedN RdrName -> AmbiguousFieldOcc GhcPs
forall a b. (a -> b) -> a -> b
$ RdrNameStr -> LocatedN RdrName
valueRdrName RdrNameStr
f
            , hfbRHS :: GenLocated (SrcSpanAnn AnnListItem) HsExpr'
hfbRHS = HsExpr' -> GenLocated (SrcSpanAnn AnnListItem) HsExpr'
forall a ann. a -> GenLocated (SrcSpanAnn ann) a
mkLocated HsExpr'
e'
            , hfbPun :: Bool
hfbPun = Bool
False
            , hfbAnn :: XHsFieldBind
  (GenLocated (SrcSpanAnn NoEpAnns) (AmbiguousFieldOcc GhcPs))
hfbAnn = XHsFieldBind
  (GenLocated (SrcSpanAnn NoEpAnns) (AmbiguousFieldOcc GhcPs))
EpAnn [AddEpAnn]
forall ann. EpAnn ann
EpAnnNotUsed
#else
        mkLocated HsRecField
            { hsRecFieldLbl =
                builtLoc $ withPlaceHolder $ noExt Ambiguous $ valueRdrName f
            , hsRecFieldArg = mkLocated e'
            , hsRecPun = False
#if MIN_VERSION_ghc(9,2,0)
            , hsRecFieldAnn = EpAnnNotUsed
#endif
#endif
            }
    withPlaceHolder4 :: c -> c
withPlaceHolder4 = c -> c
forall {a}. a -> a
withPlaceHolder (c -> c) -> (c -> c) -> c -> c
forall b c a. (b -> c) -> (a -> b) -> a -> c
. c -> c
forall {a}. a -> a
withPlaceHolder (c -> c) -> (c -> c) -> c -> c
forall b c a. (b -> c) -> (a -> b) -> a -> c
. c -> c
forall {a}. a -> a
withPlaceHolder
                            (c -> c) -> (c -> c) -> c -> c
forall b c a. (b -> c) -> (a -> b) -> a -> c
. c -> c
forall {a}. a -> a
withPlaceHolder
#if MIN_VERSION_ghc(9,2,0)
    toRecordUpdFields :: a -> Either a b
toRecordUpdFields = a -> Either a b
forall {a} {b}. a -> Either a b
Left
#else
    toRecordUpdFields = id
#endif

arithSeq :: ArithSeqInfo GhcPs -> HsExpr'
arithSeq :: ArithSeqInfo GhcPs -> HsExpr'
arithSeq =
#if MIN_VERSION_ghc(8,6,0)
    (EpAnn [AddEpAnn]
 -> Maybe NoExtField -> ArithSeqInfo GhcPs -> HsExpr')
-> Maybe NoExtField -> ArithSeqInfo GhcPs -> HsExpr'
forall ann a. (EpAnn ann -> a) -> a
withEpAnnNotUsed XArithSeq GhcPs
-> Maybe (SyntaxExpr GhcPs) -> ArithSeqInfo GhcPs -> HsExpr'
EpAnn [AddEpAnn]
-> Maybe NoExtField -> ArithSeqInfo GhcPs -> HsExpr'
forall p.
XArithSeq p -> Maybe (SyntaxExpr p) -> ArithSeqInfo p -> HsExpr p
ArithSeq Maybe NoExtField
forall a. Maybe a
Nothing
#else
    ArithSeq noPostTcExpr Nothing
#endif

-- | An arithmetic sequence expression with a start value.
--
-- > [a ..]
-- > =====
-- > from (var "a")
from :: HsExpr' -> HsExpr'
from :: HsExpr' -> HsExpr'
from HsExpr'
from' = ArithSeqInfo GhcPs -> HsExpr'
arithSeq (ArithSeqInfo GhcPs -> HsExpr') -> ArithSeqInfo GhcPs -> HsExpr'
forall a b. (a -> b) -> a -> b
$ LHsExpr GhcPs -> ArithSeqInfo GhcPs
forall id. LHsExpr id -> ArithSeqInfo id
From (HsExpr' -> GenLocated (SrcSpanAnn AnnListItem) HsExpr'
forall a ann. a -> GenLocated (SrcSpanAnn ann) a
mkLocated HsExpr'
from')

-- | An arithmetic sequence expression with a start and a step values.
--
-- > [a, b ..]
-- > =====
-- > fromThen (var "a") (var "b")
fromThen :: HsExpr' -> HsExpr' -> HsExpr'
fromThen :: HsExpr' -> HsExpr' -> HsExpr'
fromThen HsExpr'
from' HsExpr'
then' = ArithSeqInfo GhcPs -> HsExpr'
arithSeq (ArithSeqInfo GhcPs -> HsExpr') -> ArithSeqInfo GhcPs -> HsExpr'
forall a b. (a -> b) -> a -> b
$ LHsExpr GhcPs -> LHsExpr GhcPs -> ArithSeqInfo GhcPs
forall id. LHsExpr id -> LHsExpr id -> ArithSeqInfo id
FromThen (HsExpr' -> GenLocated (SrcSpanAnn AnnListItem) HsExpr'
forall a ann. a -> GenLocated (SrcSpanAnn ann) a
mkLocated HsExpr'
from') (HsExpr' -> GenLocated (SrcSpanAnn AnnListItem) HsExpr'
forall a ann. a -> GenLocated (SrcSpanAnn ann) a
mkLocated HsExpr'
then')

-- | An arithmetic sequence expression with a start and an end values.
--
-- > [a .. b]
-- > =====
-- > fromTo (var "a") (var "b")
fromTo :: HsExpr' -> HsExpr' -> HsExpr'
fromTo :: HsExpr' -> HsExpr' -> HsExpr'
fromTo HsExpr'
from' HsExpr'
to = ArithSeqInfo GhcPs -> HsExpr'
arithSeq (ArithSeqInfo GhcPs -> HsExpr') -> ArithSeqInfo GhcPs -> HsExpr'
forall a b. (a -> b) -> a -> b
$ LHsExpr GhcPs -> LHsExpr GhcPs -> ArithSeqInfo GhcPs
forall id. LHsExpr id -> LHsExpr id -> ArithSeqInfo id
FromTo (HsExpr' -> GenLocated (SrcSpanAnn AnnListItem) HsExpr'
forall a ann. a -> GenLocated (SrcSpanAnn ann) a
mkLocated HsExpr'
from') (HsExpr' -> GenLocated (SrcSpanAnn AnnListItem) HsExpr'
forall a ann. a -> GenLocated (SrcSpanAnn ann) a
mkLocated HsExpr'
to)

-- | An arithmetic sequence expression with a start, a step, and an end values.
--
-- > [a, b .. c]
-- > =====
-- > fromThenTo (var "a") (var "b") (var "c")
fromThenTo :: HsExpr' -> HsExpr' -> HsExpr' -> HsExpr'
fromThenTo :: HsExpr' -> HsExpr' -> HsExpr' -> HsExpr'
fromThenTo HsExpr'
from' HsExpr'
then' HsExpr'
to =
    ArithSeqInfo GhcPs -> HsExpr'
arithSeq (ArithSeqInfo GhcPs -> HsExpr') -> ArithSeqInfo GhcPs -> HsExpr'
forall a b. (a -> b) -> a -> b
$ LHsExpr GhcPs
-> LHsExpr GhcPs -> LHsExpr GhcPs -> ArithSeqInfo GhcPs
forall id.
LHsExpr id -> LHsExpr id -> LHsExpr id -> ArithSeqInfo id
FromThenTo (HsExpr' -> GenLocated (SrcSpanAnn AnnListItem) HsExpr'
forall a ann. a -> GenLocated (SrcSpanAnn ann) a
mkLocated HsExpr'
from') (HsExpr' -> GenLocated (SrcSpanAnn AnnListItem) HsExpr'
forall a ann. a -> GenLocated (SrcSpanAnn ann) a
mkLocated HsExpr'
then') (HsExpr' -> GenLocated (SrcSpanAnn AnnListItem) HsExpr'
forall a ann. a -> GenLocated (SrcSpanAnn ann) a
mkLocated HsExpr'
to)