{-
(c) The GRASP/AQUA Project, Glasgow University, 1992-1998

\section[RnExpr]{Renaming of expressions}

Basically dependency analysis.

Handles @Match@, @GRHSs@, @HsExpr@, and @Qualifier@ datatypes.  In
general, all of these functions return a renamed thing, and a set of
free variables.
-}

{-# LANGUAGE CPP #-}
{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE MultiWayIf #-}
{-# LANGUAGE TypeFamilies #-}
{-# LANGUAGE ViewPatterns #-}

module RnExpr (
        rnLExpr, rnExpr, rnStmts
   ) where

#include "HsVersions.h"

import GhcPrelude

import RnBinds   ( rnLocalBindsAndThen, rnLocalValBindsLHS, rnLocalValBindsRHS,
                   rnMatchGroup, rnGRHS, makeMiniFixityEnv)
import HsSyn
import TcEnv            ( isBrackStage )
import TcRnMonad
import Module           ( getModule )
import RnEnv
import RnFixity
import RnUtils          ( HsDocContext(..), bindLocalNamesFV, checkDupNames
                        , bindLocalNames
                        , mapMaybeFvRn, mapFvRn
                        , warnUnusedLocalBinds, typeAppErr )
import RnUnbound        ( reportUnboundName )
import RnSplice         ( rnBracket, rnSpliceExpr, checkThLocalName )
import RnTypes
import RnPat
import DynFlags
import PrelNames

import BasicTypes
import Name
import NameSet
import RdrName
import UniqSet
import Data.List
import Util
import ListSetOps       ( removeDups )
import ErrUtils
import Outputable
import SrcLoc
import FastString
import Control.Monad
import TysWiredIn       ( nilDataConName )
import qualified GHC.LanguageExtensions as LangExt

import Data.Ord
import Data.Array
import qualified Data.List.NonEmpty as NE

import Unique           ( mkVarOccUnique )

{-
************************************************************************
*                                                                      *
\subsubsection{Expressions}
*                                                                      *
************************************************************************
-}

rnExprs :: [LHsExpr GhcPs] -> RnM ([LHsExpr GhcRn], FreeVars)
rnExprs :: [LHsExpr GhcPs] -> RnM ([LHsExpr GhcRn], FreeVars)
rnExprs ls :: [LHsExpr GhcPs]
ls = [LHsExpr GhcPs] -> FreeVars -> RnM ([LHsExpr GhcRn], FreeVars)
rnExprs' [LHsExpr GhcPs]
ls FreeVars
forall a. UniqSet a
emptyUniqSet
 where
  rnExprs' :: [LHsExpr GhcPs] -> FreeVars -> RnM ([LHsExpr GhcRn], FreeVars)
rnExprs' [] acc :: FreeVars
acc = ([LHsExpr GhcRn], FreeVars) -> RnM ([LHsExpr GhcRn], FreeVars)
forall (m :: * -> *) a. Monad m => a -> m a
return ([], FreeVars
acc)
  rnExprs' (expr :: LHsExpr GhcPs
expr:exprs :: [LHsExpr GhcPs]
exprs) acc :: FreeVars
acc =
   do { (expr' :: LHsExpr GhcRn
expr', fvExpr :: FreeVars
fvExpr) <- LHsExpr GhcPs -> RnM (LHsExpr GhcRn, FreeVars)
rnLExpr LHsExpr GhcPs
expr
        -- Now we do a "seq" on the free vars because typically it's small
        -- or empty, especially in very long lists of constants
      ; let  acc' :: FreeVars
acc' = FreeVars
acc FreeVars -> FreeVars -> FreeVars
`plusFV` FreeVars
fvExpr
      ; (exprs' :: [LHsExpr GhcRn]
exprs', fvExprs :: FreeVars
fvExprs) <- FreeVars
acc' FreeVars
-> RnM ([LHsExpr GhcRn], FreeVars)
-> RnM ([LHsExpr GhcRn], FreeVars)
forall a b. a -> b -> b
`seq` [LHsExpr GhcPs] -> FreeVars -> RnM ([LHsExpr GhcRn], FreeVars)
rnExprs' [LHsExpr GhcPs]
exprs FreeVars
acc'
      ; ([LHsExpr GhcRn], FreeVars) -> RnM ([LHsExpr GhcRn], FreeVars)
forall (m :: * -> *) a. Monad m => a -> m a
return (LHsExpr GhcRn
expr'LHsExpr GhcRn -> [LHsExpr GhcRn] -> [LHsExpr GhcRn]
forall a. a -> [a] -> [a]
:[LHsExpr GhcRn]
exprs', FreeVars
fvExprs) }

-- Variables. We look up the variable and return the resulting name.

rnLExpr :: LHsExpr GhcPs -> RnM (LHsExpr GhcRn, FreeVars)
rnLExpr :: LHsExpr GhcPs -> RnM (LHsExpr GhcRn, FreeVars)
rnLExpr = (SrcSpanLess (LHsExpr GhcPs)
 -> TcM (SrcSpanLess (LHsExpr GhcRn), FreeVars))
-> LHsExpr GhcPs -> RnM (LHsExpr GhcRn, FreeVars)
forall a b c.
(HasSrcSpan a, HasSrcSpan b) =>
(SrcSpanLess a -> TcM (SrcSpanLess b, c)) -> a -> TcM (b, c)
wrapLocFstM SrcSpanLess (LHsExpr GhcPs)
-> TcM (SrcSpanLess (LHsExpr GhcRn), FreeVars)
HsExpr GhcPs -> RnM (HsExpr GhcRn, FreeVars)
rnExpr

rnExpr :: HsExpr GhcPs -> RnM (HsExpr GhcRn, FreeVars)

finishHsVar :: Located Name -> RnM (HsExpr GhcRn, FreeVars)
-- Separated from rnExpr because it's also used
-- when renaming infix expressions
finishHsVar :: Located Name -> RnM (HsExpr GhcRn, FreeVars)
finishHsVar (L l :: SrcSpan
l name :: Name
name)
 = do { Module
this_mod <- IOEnv (Env TcGblEnv TcLclEnv) Module
forall (m :: * -> *). HasModule m => m Module
getModule
      ; Bool
-> IOEnv (Env TcGblEnv TcLclEnv) ()
-> IOEnv (Env TcGblEnv TcLclEnv) ()
forall (f :: * -> *). Applicative f => Bool -> f () -> f ()
when (Module -> Name -> Bool
nameIsLocalOrFrom Module
this_mod Name
name) (IOEnv (Env TcGblEnv TcLclEnv) ()
 -> IOEnv (Env TcGblEnv TcLclEnv) ())
-> IOEnv (Env TcGblEnv TcLclEnv) ()
-> IOEnv (Env TcGblEnv TcLclEnv) ()
forall a b. (a -> b) -> a -> b
$
        Name -> IOEnv (Env TcGblEnv TcLclEnv) ()
checkThLocalName Name
name
      ; (HsExpr GhcRn, FreeVars) -> RnM (HsExpr GhcRn, FreeVars)
forall (m :: * -> *) a. Monad m => a -> m a
return (XVar GhcRn -> Located (IdP GhcRn) -> HsExpr GhcRn
forall p. XVar p -> Located (IdP p) -> HsExpr p
HsVar XVar GhcRn
NoExt
noExt (SrcSpan -> Name -> Located Name
forall l e. l -> e -> GenLocated l e
L SrcSpan
l Name
name), Name -> FreeVars
unitFV Name
name) }

rnUnboundVar :: RdrName -> RnM (HsExpr GhcRn, FreeVars)
rnUnboundVar :: RdrName -> RnM (HsExpr GhcRn, FreeVars)
rnUnboundVar v :: RdrName
v
 = do { if RdrName -> Bool
isUnqual RdrName
v
        then -- Treat this as a "hole"
             -- Do not fail right now; instead, return HsUnboundVar
             -- and let the type checker report the error
             do { let occ :: OccName
occ = RdrName -> OccName
rdrNameOcc RdrName
v
                ; UnboundVar
uv <- if OccName -> Bool
startsWithUnderscore OccName
occ
                        then UnboundVar -> IOEnv (Env TcGblEnv TcLclEnv) UnboundVar
forall (m :: * -> *) a. Monad m => a -> m a
return (OccName -> UnboundVar
TrueExprHole OccName
occ)
                        else OccName -> GlobalRdrEnv -> UnboundVar
OutOfScope OccName
occ (GlobalRdrEnv -> UnboundVar)
-> IOEnv (Env TcGblEnv TcLclEnv) GlobalRdrEnv
-> IOEnv (Env TcGblEnv TcLclEnv) UnboundVar
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> IOEnv (Env TcGblEnv TcLclEnv) GlobalRdrEnv
getGlobalRdrEnv
                ; (HsExpr GhcRn, FreeVars) -> RnM (HsExpr GhcRn, FreeVars)
forall (m :: * -> *) a. Monad m => a -> m a
return (XUnboundVar GhcRn -> UnboundVar -> HsExpr GhcRn
forall p. XUnboundVar p -> UnboundVar -> HsExpr p
HsUnboundVar XUnboundVar GhcRn
NoExt
noExt UnboundVar
uv, FreeVars
emptyFVs) }

        else -- Fail immediately (qualified name)
             do { Name
n <- RdrName -> RnM Name
reportUnboundName RdrName
v
                ; (HsExpr GhcRn, FreeVars) -> RnM (HsExpr GhcRn, FreeVars)
forall (m :: * -> *) a. Monad m => a -> m a
return (XVar GhcRn -> Located (IdP GhcRn) -> HsExpr GhcRn
forall p. XVar p -> Located (IdP p) -> HsExpr p
HsVar XVar GhcRn
NoExt
noExt (SrcSpanLess (Located Name) -> Located Name
forall a. HasSrcSpan a => SrcSpanLess a -> a
noLoc Name
SrcSpanLess (Located Name)
n), FreeVars
emptyFVs) } }

rnExpr :: HsExpr GhcPs -> RnM (HsExpr GhcRn, FreeVars)
rnExpr (HsVar _ (L l :: SrcSpan
l v :: IdP GhcPs
v))
  = do { Bool
opt_DuplicateRecordFields <- Extension -> TcRnIf TcGblEnv TcLclEnv Bool
forall gbl lcl. Extension -> TcRnIf gbl lcl Bool
xoptM Extension
LangExt.DuplicateRecordFields
       ; Maybe (Either Name [Name])
mb_name <- Bool -> RdrName -> RnM (Maybe (Either Name [Name]))
lookupOccRn_overloaded Bool
opt_DuplicateRecordFields RdrName
IdP GhcPs
v
       ; case Maybe (Either Name [Name])
mb_name of {
           Nothing -> RdrName -> RnM (HsExpr GhcRn, FreeVars)
rnUnboundVar RdrName
IdP GhcPs
v ;
           Just (Left name :: Name
name)
              | Name
name Name -> Name -> Bool
forall a. Eq a => a -> a -> Bool
== Name
nilDataConName -- Treat [] as an ExplicitList, so that
                                       -- OverloadedLists works correctly
              -> HsExpr GhcPs -> RnM (HsExpr GhcRn, FreeVars)
rnExpr (XExplicitList GhcPs
-> Maybe (SyntaxExpr GhcPs) -> [LHsExpr GhcPs] -> HsExpr GhcPs
forall p.
XExplicitList p -> Maybe (SyntaxExpr p) -> [LHsExpr p] -> HsExpr p
ExplicitList XExplicitList GhcPs
NoExt
noExt Maybe (SyntaxExpr GhcPs)
forall a. Maybe a
Nothing [])

              | Bool
otherwise
              -> Located Name -> RnM (HsExpr GhcRn, FreeVars)
finishHsVar (SrcSpan -> Name -> Located Name
forall l e. l -> e -> GenLocated l e
L SrcSpan
l Name
name) ;
            Just (Right [s :: Name
s]) ->
              (HsExpr GhcRn, FreeVars) -> RnM (HsExpr GhcRn, FreeVars)
forall (m :: * -> *) a. Monad m => a -> m a
return ( XRecFld GhcRn -> AmbiguousFieldOcc GhcRn -> HsExpr GhcRn
forall p. XRecFld p -> AmbiguousFieldOcc p -> HsExpr p
HsRecFld XRecFld GhcRn
NoExt
noExt (XUnambiguous GhcRn -> Located RdrName -> AmbiguousFieldOcc GhcRn
forall pass.
XUnambiguous pass -> Located RdrName -> AmbiguousFieldOcc pass
Unambiguous Name
XUnambiguous GhcRn
s (SrcSpan -> RdrName -> Located RdrName
forall l e. l -> e -> GenLocated l e
L SrcSpan
l RdrName
IdP GhcPs
v) ), Name -> FreeVars
unitFV Name
s) ;
           Just (Right fs :: [Name]
fs@(_:_:_)) ->
              (HsExpr GhcRn, FreeVars) -> RnM (HsExpr GhcRn, FreeVars)
forall (m :: * -> *) a. Monad m => a -> m a
return ( XRecFld GhcRn -> AmbiguousFieldOcc GhcRn -> HsExpr GhcRn
forall p. XRecFld p -> AmbiguousFieldOcc p -> HsExpr p
HsRecFld XRecFld GhcRn
NoExt
noExt (XAmbiguous GhcRn -> Located RdrName -> AmbiguousFieldOcc GhcRn
forall pass.
XAmbiguous pass -> Located RdrName -> AmbiguousFieldOcc pass
Ambiguous XAmbiguous GhcRn
NoExt
noExt (SrcSpan -> RdrName -> Located RdrName
forall l e. l -> e -> GenLocated l e
L SrcSpan
l RdrName
IdP GhcPs
v))
                     , [Name] -> FreeVars
mkFVs [Name]
fs);
           Just (Right [])         -> String -> RnM (HsExpr GhcRn, FreeVars)
forall a. String -> a
panic "runExpr/HsVar" } }

rnExpr (HsIPVar x :: XIPVar GhcPs
x v :: HsIPName
v)
  = (HsExpr GhcRn, FreeVars) -> RnM (HsExpr GhcRn, FreeVars)
forall (m :: * -> *) a. Monad m => a -> m a
return (XIPVar GhcRn -> HsIPName -> HsExpr GhcRn
forall p. XIPVar p -> HsIPName -> HsExpr p
HsIPVar XIPVar GhcPs
XIPVar GhcRn
x HsIPName
v, FreeVars
emptyFVs)

rnExpr (HsOverLabel x :: XOverLabel GhcPs
x _ v :: FastString
v)
  = do { Bool
rebindable_on <- Extension -> TcRnIf TcGblEnv TcLclEnv Bool
forall gbl lcl. Extension -> TcRnIf gbl lcl Bool
xoptM Extension
LangExt.RebindableSyntax
       ; if Bool
rebindable_on
         then do { Name
fromLabel <- RdrName -> RnM Name
lookupOccRn (FastString -> RdrName
mkVarUnqual (String -> FastString
fsLit "fromLabel"))
                 ; (HsExpr GhcRn, FreeVars) -> RnM (HsExpr GhcRn, FreeVars)
forall (m :: * -> *) a. Monad m => a -> m a
return (XOverLabel GhcRn -> Maybe (IdP GhcRn) -> FastString -> HsExpr GhcRn
forall p. XOverLabel p -> Maybe (IdP p) -> FastString -> HsExpr p
HsOverLabel XOverLabel GhcPs
XOverLabel GhcRn
x (Name -> Maybe Name
forall a. a -> Maybe a
Just Name
fromLabel) FastString
v, Name -> FreeVars
unitFV Name
fromLabel) }
         else (HsExpr GhcRn, FreeVars) -> RnM (HsExpr GhcRn, FreeVars)
forall (m :: * -> *) a. Monad m => a -> m a
return (XOverLabel GhcRn -> Maybe (IdP GhcRn) -> FastString -> HsExpr GhcRn
forall p. XOverLabel p -> Maybe (IdP p) -> FastString -> HsExpr p
HsOverLabel XOverLabel GhcPs
XOverLabel GhcRn
x Maybe (IdP GhcRn)
forall a. Maybe a
Nothing FastString
v, FreeVars
emptyFVs) }

rnExpr (HsLit x :: XLitE GhcPs
x lit :: HsLit GhcPs
lit@(HsString src :: XHsString GhcPs
src s :: FastString
s))
  = do { Bool
opt_OverloadedStrings <- Extension -> TcRnIf TcGblEnv TcLclEnv Bool
forall gbl lcl. Extension -> TcRnIf gbl lcl Bool
xoptM Extension
LangExt.OverloadedStrings
       ; if Bool
opt_OverloadedStrings then
            HsExpr GhcPs -> RnM (HsExpr GhcRn, FreeVars)
rnExpr (XOverLitE GhcPs -> HsOverLit GhcPs -> HsExpr GhcPs
forall p. XOverLitE p -> HsOverLit p -> HsExpr p
HsOverLit XLitE GhcPs
XOverLitE GhcPs
x (SourceText -> FastString -> HsOverLit GhcPs
mkHsIsString SourceText
XHsString GhcPs
src FastString
s))
         else do {
            ; HsLit GhcPs -> IOEnv (Env TcGblEnv TcLclEnv) ()
forall p. HsLit p -> IOEnv (Env TcGblEnv TcLclEnv) ()
rnLit HsLit GhcPs
lit
            ; (HsExpr GhcRn, FreeVars) -> RnM (HsExpr GhcRn, FreeVars)
forall (m :: * -> *) a. Monad m => a -> m a
return (XLitE GhcRn -> HsLit GhcRn -> HsExpr GhcRn
forall p. XLitE p -> HsLit p -> HsExpr p
HsLit XLitE GhcPs
XLitE GhcRn
x (HsLit GhcPs -> HsLit GhcRn
forall a b. ConvertIdX a b => HsLit a -> HsLit b
convertLit HsLit GhcPs
lit), FreeVars
emptyFVs) } }

rnExpr (HsLit x :: XLitE GhcPs
x lit :: HsLit GhcPs
lit)
  = do { HsLit GhcPs -> IOEnv (Env TcGblEnv TcLclEnv) ()
forall p. HsLit p -> IOEnv (Env TcGblEnv TcLclEnv) ()
rnLit HsLit GhcPs
lit
       ; (HsExpr GhcRn, FreeVars) -> RnM (HsExpr GhcRn, FreeVars)
forall (m :: * -> *) a. Monad m => a -> m a
return (XLitE GhcRn -> HsLit GhcRn -> HsExpr GhcRn
forall p. XLitE p -> HsLit p -> HsExpr p
HsLit XLitE GhcPs
XLitE GhcRn
x(HsLit GhcPs -> HsLit GhcRn
forall a b. ConvertIdX a b => HsLit a -> HsLit b
convertLit HsLit GhcPs
lit), FreeVars
emptyFVs) }

rnExpr (HsOverLit x :: XOverLitE GhcPs
x lit :: HsOverLit GhcPs
lit)
  = do { ((lit' :: HsOverLit GhcRn
lit', mb_neg :: Maybe (HsExpr GhcRn)
mb_neg), fvs :: FreeVars
fvs) <- HsOverLit GhcPs
-> RnM ((HsOverLit GhcRn, Maybe (HsExpr GhcRn)), FreeVars)
forall t.
HsOverLit t
-> RnM ((HsOverLit GhcRn, Maybe (HsExpr GhcRn)), FreeVars)
rnOverLit HsOverLit GhcPs
lit -- See Note [Negative zero]
       ; case Maybe (HsExpr GhcRn)
mb_neg of
              Nothing -> (HsExpr GhcRn, FreeVars) -> RnM (HsExpr GhcRn, FreeVars)
forall (m :: * -> *) a. Monad m => a -> m a
return (XOverLitE GhcRn -> HsOverLit GhcRn -> HsExpr GhcRn
forall p. XOverLitE p -> HsOverLit p -> HsExpr p
HsOverLit XOverLitE GhcPs
XOverLitE GhcRn
x HsOverLit GhcRn
lit', FreeVars
fvs)
              Just neg :: HsExpr GhcRn
neg -> (HsExpr GhcRn, FreeVars) -> RnM (HsExpr GhcRn, FreeVars)
forall (m :: * -> *) a. Monad m => a -> m a
return (XApp GhcRn -> LHsExpr GhcRn -> LHsExpr GhcRn -> HsExpr GhcRn
forall p. XApp p -> LHsExpr p -> LHsExpr p -> HsExpr p
HsApp XApp GhcRn
XOverLitE GhcPs
x (SrcSpanLess (LHsExpr GhcRn) -> LHsExpr GhcRn
forall a. HasSrcSpan a => SrcSpanLess a -> a
noLoc SrcSpanLess (LHsExpr GhcRn)
HsExpr GhcRn
neg) (SrcSpanLess (LHsExpr GhcRn) -> LHsExpr GhcRn
forall a. HasSrcSpan a => SrcSpanLess a -> a
noLoc (XOverLitE GhcRn -> HsOverLit GhcRn -> HsExpr GhcRn
forall p. XOverLitE p -> HsOverLit p -> HsExpr p
HsOverLit XOverLitE GhcPs
XOverLitE GhcRn
x HsOverLit GhcRn
lit'))
                                 , FreeVars
fvs ) }

rnExpr (HsApp x :: XApp GhcPs
x fun :: LHsExpr GhcPs
fun arg :: LHsExpr GhcPs
arg)
  = do { (fun' :: LHsExpr GhcRn
fun',fvFun :: FreeVars
fvFun) <- LHsExpr GhcPs -> RnM (LHsExpr GhcRn, FreeVars)
rnLExpr LHsExpr GhcPs
fun
       ; (arg' :: LHsExpr GhcRn
arg',fvArg :: FreeVars
fvArg) <- LHsExpr GhcPs -> RnM (LHsExpr GhcRn, FreeVars)
rnLExpr LHsExpr GhcPs
arg
       ; (HsExpr GhcRn, FreeVars) -> RnM (HsExpr GhcRn, FreeVars)
forall (m :: * -> *) a. Monad m => a -> m a
return (XApp GhcRn -> LHsExpr GhcRn -> LHsExpr GhcRn -> HsExpr GhcRn
forall p. XApp p -> LHsExpr p -> LHsExpr p -> HsExpr p
HsApp XApp GhcPs
XApp GhcRn
x LHsExpr GhcRn
fun' LHsExpr GhcRn
arg', FreeVars
fvFun FreeVars -> FreeVars -> FreeVars
`plusFV` FreeVars
fvArg) }

rnExpr (HsAppType x :: XAppTypeE GhcPs
x fun :: LHsExpr GhcPs
fun arg :: LHsWcType (NoGhcTc GhcPs)
arg)
  = do { Bool
type_app <- Extension -> TcRnIf TcGblEnv TcLclEnv Bool
forall gbl lcl. Extension -> TcRnIf gbl lcl Bool
xoptM Extension
LangExt.TypeApplications
       ; Bool
-> IOEnv (Env TcGblEnv TcLclEnv) ()
-> IOEnv (Env TcGblEnv TcLclEnv) ()
forall (f :: * -> *). Applicative f => Bool -> f () -> f ()
unless Bool
type_app (IOEnv (Env TcGblEnv TcLclEnv) ()
 -> IOEnv (Env TcGblEnv TcLclEnv) ())
-> IOEnv (Env TcGblEnv TcLclEnv) ()
-> IOEnv (Env TcGblEnv TcLclEnv) ()
forall a b. (a -> b) -> a -> b
$ MsgDoc -> IOEnv (Env TcGblEnv TcLclEnv) ()
addErr (MsgDoc -> IOEnv (Env TcGblEnv TcLclEnv) ())
-> MsgDoc -> IOEnv (Env TcGblEnv TcLclEnv) ()
forall a b. (a -> b) -> a -> b
$ String -> LHsType GhcPs -> MsgDoc
typeAppErr "type" (LHsType GhcPs -> MsgDoc) -> LHsType GhcPs -> MsgDoc
forall a b. (a -> b) -> a -> b
$ HsWildCardBndrs GhcPs (LHsType GhcPs) -> LHsType GhcPs
forall pass thing. HsWildCardBndrs pass thing -> thing
hswc_body LHsWcType (NoGhcTc GhcPs)
HsWildCardBndrs GhcPs (LHsType GhcPs)
arg
       ; (fun' :: LHsExpr GhcRn
fun',fvFun :: FreeVars
fvFun) <- LHsExpr GhcPs -> RnM (LHsExpr GhcRn, FreeVars)
rnLExpr LHsExpr GhcPs
fun
       ; (arg' :: LHsWcType GhcRn
arg',fvArg :: FreeVars
fvArg) <- HsDocContext
-> HsWildCardBndrs GhcPs (LHsType GhcPs)
-> RnM (LHsWcType GhcRn, FreeVars)
rnHsWcType HsDocContext
HsTypeCtx LHsWcType (NoGhcTc GhcPs)
HsWildCardBndrs GhcPs (LHsType GhcPs)
arg
       ; (HsExpr GhcRn, FreeVars) -> RnM (HsExpr GhcRn, FreeVars)
forall (m :: * -> *) a. Monad m => a -> m a
return (XAppTypeE GhcRn
-> LHsExpr GhcRn -> LHsWcType (NoGhcTc GhcRn) -> HsExpr GhcRn
forall p.
XAppTypeE p -> LHsExpr p -> LHsWcType (NoGhcTc p) -> HsExpr p
HsAppType XAppTypeE GhcPs
XAppTypeE GhcRn
x LHsExpr GhcRn
fun' LHsWcType (NoGhcTc GhcRn)
LHsWcType GhcRn
arg', FreeVars
fvFun FreeVars -> FreeVars -> FreeVars
`plusFV` FreeVars
fvArg) }

rnExpr (OpApp _ e1 :: LHsExpr GhcPs
e1 op :: LHsExpr GhcPs
op e2 :: LHsExpr GhcPs
e2)
  = do  { (e1' :: LHsExpr GhcRn
e1', fv_e1 :: FreeVars
fv_e1) <- LHsExpr GhcPs -> RnM (LHsExpr GhcRn, FreeVars)
rnLExpr LHsExpr GhcPs
e1
        ; (e2' :: LHsExpr GhcRn
e2', fv_e2 :: FreeVars
fv_e2) <- LHsExpr GhcPs -> RnM (LHsExpr GhcRn, FreeVars)
rnLExpr LHsExpr GhcPs
e2
        ; (op' :: LHsExpr GhcRn
op', fv_op :: FreeVars
fv_op) <- LHsExpr GhcPs -> RnM (LHsExpr GhcRn, FreeVars)
rnLExpr LHsExpr GhcPs
op

        -- Deal with fixity
        -- When renaming code synthesised from "deriving" declarations
        -- we used to avoid fixity stuff, but we can't easily tell any
        -- more, so I've removed the test.  Adding HsPars in TcGenDeriv
        -- should prevent bad things happening.
        ; Fixity
fixity <- case LHsExpr GhcRn
op' of
              L _ (HsVar _ (L _ n :: IdP GhcRn
n)) -> Name -> RnM Fixity
lookupFixityRn Name
IdP GhcRn
n
              L _ (HsRecFld _ f :: AmbiguousFieldOcc GhcRn
f)    -> AmbiguousFieldOcc GhcRn -> RnM Fixity
lookupFieldFixityRn AmbiguousFieldOcc GhcRn
f
              _ -> Fixity -> RnM Fixity
forall (m :: * -> *) a. Monad m => a -> m a
return (SourceText -> Int -> FixityDirection -> Fixity
Fixity SourceText
NoSourceText Int
minPrecedence FixityDirection
InfixL)
                   -- c.f. lookupFixity for unbound

        ; HsExpr GhcRn
final_e <- LHsExpr GhcRn
-> LHsExpr GhcRn -> Fixity -> LHsExpr GhcRn -> RnM (HsExpr GhcRn)
mkOpAppRn LHsExpr GhcRn
e1' LHsExpr GhcRn
op' Fixity
fixity LHsExpr GhcRn
e2'
        ; (HsExpr GhcRn, FreeVars) -> RnM (HsExpr GhcRn, FreeVars)
forall (m :: * -> *) a. Monad m => a -> m a
return (HsExpr GhcRn
final_e, FreeVars
fv_e1 FreeVars -> FreeVars -> FreeVars
`plusFV` FreeVars
fv_op FreeVars -> FreeVars -> FreeVars
`plusFV` FreeVars
fv_e2) }

rnExpr (NegApp _ e :: LHsExpr GhcPs
e _)
  = do { (e' :: LHsExpr GhcRn
e', fv_e :: FreeVars
fv_e)         <- LHsExpr GhcPs -> RnM (LHsExpr GhcRn, FreeVars)
rnLExpr LHsExpr GhcPs
e
       ; (neg_name :: SyntaxExpr GhcRn
neg_name, fv_neg :: FreeVars
fv_neg) <- Name -> RnM (SyntaxExpr GhcRn, FreeVars)
lookupSyntaxName Name
negateName
       ; HsExpr GhcRn
final_e            <- LHsExpr GhcRn -> SyntaxExpr GhcRn -> RnM (HsExpr GhcRn)
forall (id :: Pass).
LHsExpr (GhcPass id)
-> SyntaxExpr (GhcPass id) -> RnM (HsExpr (GhcPass id))
mkNegAppRn LHsExpr GhcRn
e' SyntaxExpr GhcRn
neg_name
       ; (HsExpr GhcRn, FreeVars) -> RnM (HsExpr GhcRn, FreeVars)
forall (m :: * -> *) a. Monad m => a -> m a
return (HsExpr GhcRn
final_e, FreeVars
fv_e FreeVars -> FreeVars -> FreeVars
`plusFV` FreeVars
fv_neg) }

------------------------------------------
-- Template Haskell extensions
-- Don't ifdef-GHCI them because we want to fail gracefully
-- (not with an rnExpr crash) in a stage-1 compiler.
rnExpr e :: HsExpr GhcPs
e@(HsBracket _ br_body :: HsBracket GhcPs
br_body) = HsExpr GhcPs -> HsBracket GhcPs -> RnM (HsExpr GhcRn, FreeVars)
rnBracket HsExpr GhcPs
e HsBracket GhcPs
br_body

rnExpr (HsSpliceE _ splice :: HsSplice GhcPs
splice) = HsSplice GhcPs -> RnM (HsExpr GhcRn, FreeVars)
rnSpliceExpr HsSplice GhcPs
splice

---------------------------------------------
--      Sections
-- See Note [Parsing sections] in Parser.y
rnExpr (HsPar x :: XPar GhcPs
x (L loc :: SrcSpan
loc (section :: HsExpr GhcPs
section@(SectionL {}))))
  = do  { (section' :: HsExpr GhcRn
section', fvs :: FreeVars
fvs) <- HsExpr GhcPs -> RnM (HsExpr GhcRn, FreeVars)
rnSection HsExpr GhcPs
section
        ; (HsExpr GhcRn, FreeVars) -> RnM (HsExpr GhcRn, FreeVars)
forall (m :: * -> *) a. Monad m => a -> m a
return (XPar GhcRn -> LHsExpr GhcRn -> HsExpr GhcRn
forall p. XPar p -> LHsExpr p -> HsExpr p
HsPar XPar GhcPs
XPar GhcRn
x (SrcSpan -> HsExpr GhcRn -> LHsExpr GhcRn
forall l e. l -> e -> GenLocated l e
L SrcSpan
loc HsExpr GhcRn
section'), FreeVars
fvs) }

rnExpr (HsPar x :: XPar GhcPs
x (L loc :: SrcSpan
loc (section :: HsExpr GhcPs
section@(SectionR {}))))
  = do  { (section' :: HsExpr GhcRn
section', fvs :: FreeVars
fvs) <- HsExpr GhcPs -> RnM (HsExpr GhcRn, FreeVars)
rnSection HsExpr GhcPs
section
        ; (HsExpr GhcRn, FreeVars) -> RnM (HsExpr GhcRn, FreeVars)
forall (m :: * -> *) a. Monad m => a -> m a
return (XPar GhcRn -> LHsExpr GhcRn -> HsExpr GhcRn
forall p. XPar p -> LHsExpr p -> HsExpr p
HsPar XPar GhcPs
XPar GhcRn
x (SrcSpan -> HsExpr GhcRn -> LHsExpr GhcRn
forall l e. l -> e -> GenLocated l e
L SrcSpan
loc HsExpr GhcRn
section'), FreeVars
fvs) }

rnExpr (HsPar x :: XPar GhcPs
x e :: LHsExpr GhcPs
e)
  = do  { (e' :: LHsExpr GhcRn
e', fvs_e :: FreeVars
fvs_e) <- LHsExpr GhcPs -> RnM (LHsExpr GhcRn, FreeVars)
rnLExpr LHsExpr GhcPs
e
        ; (HsExpr GhcRn, FreeVars) -> RnM (HsExpr GhcRn, FreeVars)
forall (m :: * -> *) a. Monad m => a -> m a
return (XPar GhcRn -> LHsExpr GhcRn -> HsExpr GhcRn
forall p. XPar p -> LHsExpr p -> HsExpr p
HsPar XPar GhcPs
XPar GhcRn
x LHsExpr GhcRn
e', FreeVars
fvs_e) }

rnExpr expr :: HsExpr GhcPs
expr@(SectionL {})
  = do  { MsgDoc -> IOEnv (Env TcGblEnv TcLclEnv) ()
addErr (HsExpr GhcPs -> MsgDoc
sectionErr HsExpr GhcPs
expr); HsExpr GhcPs -> RnM (HsExpr GhcRn, FreeVars)
rnSection HsExpr GhcPs
expr }
rnExpr expr :: HsExpr GhcPs
expr@(SectionR {})
  = do  { MsgDoc -> IOEnv (Env TcGblEnv TcLclEnv) ()
addErr (HsExpr GhcPs -> MsgDoc
sectionErr HsExpr GhcPs
expr); HsExpr GhcPs -> RnM (HsExpr GhcRn, FreeVars)
rnSection HsExpr GhcPs
expr }

---------------------------------------------
rnExpr (HsCoreAnn x :: XCoreAnn GhcPs
x src :: SourceText
src ann :: StringLiteral
ann expr :: LHsExpr GhcPs
expr)
  = do { (expr' :: LHsExpr GhcRn
expr', fvs_expr :: FreeVars
fvs_expr) <- LHsExpr GhcPs -> RnM (LHsExpr GhcRn, FreeVars)
rnLExpr LHsExpr GhcPs
expr
       ; (HsExpr GhcRn, FreeVars) -> RnM (HsExpr GhcRn, FreeVars)
forall (m :: * -> *) a. Monad m => a -> m a
return (XCoreAnn GhcRn
-> SourceText -> StringLiteral -> LHsExpr GhcRn -> HsExpr GhcRn
forall p.
XCoreAnn p -> SourceText -> StringLiteral -> LHsExpr p -> HsExpr p
HsCoreAnn XCoreAnn GhcPs
XCoreAnn GhcRn
x SourceText
src StringLiteral
ann LHsExpr GhcRn
expr', FreeVars
fvs_expr) }

rnExpr (HsSCC x :: XSCC GhcPs
x src :: SourceText
src lbl :: StringLiteral
lbl expr :: LHsExpr GhcPs
expr)
  = do { (expr' :: LHsExpr GhcRn
expr', fvs_expr :: FreeVars
fvs_expr) <- LHsExpr GhcPs -> RnM (LHsExpr GhcRn, FreeVars)
rnLExpr LHsExpr GhcPs
expr
       ; (HsExpr GhcRn, FreeVars) -> RnM (HsExpr GhcRn, FreeVars)
forall (m :: * -> *) a. Monad m => a -> m a
return (XSCC GhcRn
-> SourceText -> StringLiteral -> LHsExpr GhcRn -> HsExpr GhcRn
forall p.
XSCC p -> SourceText -> StringLiteral -> LHsExpr p -> HsExpr p
HsSCC XSCC GhcPs
XSCC GhcRn
x SourceText
src StringLiteral
lbl LHsExpr GhcRn
expr', FreeVars
fvs_expr) }
rnExpr (HsTickPragma x :: XTickPragma GhcPs
x src :: SourceText
src info :: (StringLiteral, (Int, Int), (Int, Int))
info srcInfo :: ((SourceText, SourceText), (SourceText, SourceText))
srcInfo expr :: LHsExpr GhcPs
expr)
  = do { (expr' :: LHsExpr GhcRn
expr', fvs_expr :: FreeVars
fvs_expr) <- LHsExpr GhcPs -> RnM (LHsExpr GhcRn, FreeVars)
rnLExpr LHsExpr GhcPs
expr
       ; (HsExpr GhcRn, FreeVars) -> RnM (HsExpr GhcRn, FreeVars)
forall (m :: * -> *) a. Monad m => a -> m a
return (XTickPragma GhcRn
-> SourceText
-> (StringLiteral, (Int, Int), (Int, Int))
-> ((SourceText, SourceText), (SourceText, SourceText))
-> LHsExpr GhcRn
-> HsExpr GhcRn
forall p.
XTickPragma p
-> SourceText
-> (StringLiteral, (Int, Int), (Int, Int))
-> ((SourceText, SourceText), (SourceText, SourceText))
-> LHsExpr p
-> HsExpr p
HsTickPragma XTickPragma GhcPs
XTickPragma GhcRn
x SourceText
src (StringLiteral, (Int, Int), (Int, Int))
info ((SourceText, SourceText), (SourceText, SourceText))
srcInfo LHsExpr GhcRn
expr', FreeVars
fvs_expr) }

rnExpr (HsLam x :: XLam GhcPs
x matches :: MatchGroup GhcPs (LHsExpr GhcPs)
matches)
  = do { (matches' :: MatchGroup GhcRn (LHsExpr GhcRn)
matches', fvMatch :: FreeVars
fvMatch) <- HsMatchContext Name
-> (LHsExpr GhcPs -> RnM (LHsExpr GhcRn, FreeVars))
-> MatchGroup GhcPs (LHsExpr GhcPs)
-> RnM (MatchGroup GhcRn (LHsExpr GhcRn), FreeVars)
forall (body :: * -> *).
Outputable (body GhcPs) =>
HsMatchContext Name
-> (Located (body GhcPs) -> RnM (Located (body GhcRn), FreeVars))
-> MatchGroup GhcPs (Located (body GhcPs))
-> RnM (MatchGroup GhcRn (Located (body GhcRn)), FreeVars)
rnMatchGroup HsMatchContext Name
forall id. HsMatchContext id
LambdaExpr LHsExpr GhcPs -> RnM (LHsExpr GhcRn, FreeVars)
rnLExpr MatchGroup GhcPs (LHsExpr GhcPs)
matches
       ; (HsExpr GhcRn, FreeVars) -> RnM (HsExpr GhcRn, FreeVars)
forall (m :: * -> *) a. Monad m => a -> m a
return (XLam GhcRn -> MatchGroup GhcRn (LHsExpr GhcRn) -> HsExpr GhcRn
forall p. XLam p -> MatchGroup p (LHsExpr p) -> HsExpr p
HsLam XLam GhcPs
XLam GhcRn
x MatchGroup GhcRn (LHsExpr GhcRn)
matches', FreeVars
fvMatch) }

rnExpr (HsLamCase x :: XLamCase GhcPs
x matches :: MatchGroup GhcPs (LHsExpr GhcPs)
matches)
  = do { (matches' :: MatchGroup GhcRn (LHsExpr GhcRn)
matches', fvs_ms :: FreeVars
fvs_ms) <- HsMatchContext Name
-> (LHsExpr GhcPs -> RnM (LHsExpr GhcRn, FreeVars))
-> MatchGroup GhcPs (LHsExpr GhcPs)
-> RnM (MatchGroup GhcRn (LHsExpr GhcRn), FreeVars)
forall (body :: * -> *).
Outputable (body GhcPs) =>
HsMatchContext Name
-> (Located (body GhcPs) -> RnM (Located (body GhcRn), FreeVars))
-> MatchGroup GhcPs (Located (body GhcPs))
-> RnM (MatchGroup GhcRn (Located (body GhcRn)), FreeVars)
rnMatchGroup HsMatchContext Name
forall id. HsMatchContext id
CaseAlt LHsExpr GhcPs -> RnM (LHsExpr GhcRn, FreeVars)
rnLExpr MatchGroup GhcPs (LHsExpr GhcPs)
matches
       ; (HsExpr GhcRn, FreeVars) -> RnM (HsExpr GhcRn, FreeVars)
forall (m :: * -> *) a. Monad m => a -> m a
return (XLamCase GhcRn -> MatchGroup GhcRn (LHsExpr GhcRn) -> HsExpr GhcRn
forall p. XLamCase p -> MatchGroup p (LHsExpr p) -> HsExpr p
HsLamCase XLamCase GhcPs
XLamCase GhcRn
x MatchGroup GhcRn (LHsExpr GhcRn)
matches', FreeVars
fvs_ms) }

rnExpr (HsCase x :: XCase GhcPs
x expr :: LHsExpr GhcPs
expr matches :: MatchGroup GhcPs (LHsExpr GhcPs)
matches)
  = do { (new_expr :: LHsExpr GhcRn
new_expr, e_fvs :: FreeVars
e_fvs) <- LHsExpr GhcPs -> RnM (LHsExpr GhcRn, FreeVars)
rnLExpr LHsExpr GhcPs
expr
       ; (new_matches :: MatchGroup GhcRn (LHsExpr GhcRn)
new_matches, ms_fvs :: FreeVars
ms_fvs) <- HsMatchContext Name
-> (LHsExpr GhcPs -> RnM (LHsExpr GhcRn, FreeVars))
-> MatchGroup GhcPs (LHsExpr GhcPs)
-> RnM (MatchGroup GhcRn (LHsExpr GhcRn), FreeVars)
forall (body :: * -> *).
Outputable (body GhcPs) =>
HsMatchContext Name
-> (Located (body GhcPs) -> RnM (Located (body GhcRn), FreeVars))
-> MatchGroup GhcPs (Located (body GhcPs))
-> RnM (MatchGroup GhcRn (Located (body GhcRn)), FreeVars)
rnMatchGroup HsMatchContext Name
forall id. HsMatchContext id
CaseAlt LHsExpr GhcPs -> RnM (LHsExpr GhcRn, FreeVars)
rnLExpr MatchGroup GhcPs (LHsExpr GhcPs)
matches
       ; (HsExpr GhcRn, FreeVars) -> RnM (HsExpr GhcRn, FreeVars)
forall (m :: * -> *) a. Monad m => a -> m a
return (XCase GhcRn
-> LHsExpr GhcRn
-> MatchGroup GhcRn (LHsExpr GhcRn)
-> HsExpr GhcRn
forall p.
XCase p -> LHsExpr p -> MatchGroup p (LHsExpr p) -> HsExpr p
HsCase XCase GhcPs
XCase GhcRn
x LHsExpr GhcRn
new_expr MatchGroup GhcRn (LHsExpr GhcRn)
new_matches, FreeVars
e_fvs FreeVars -> FreeVars -> FreeVars
`plusFV` FreeVars
ms_fvs) }

rnExpr (HsLet x :: XLet GhcPs
x (L l :: SrcSpan
l binds :: HsLocalBinds GhcPs
binds) expr :: LHsExpr GhcPs
expr)
  = HsLocalBinds GhcPs
-> (HsLocalBinds GhcRn -> FreeVars -> RnM (HsExpr GhcRn, FreeVars))
-> RnM (HsExpr GhcRn, FreeVars)
forall result.
HsLocalBinds GhcPs
-> (HsLocalBinds GhcRn -> FreeVars -> RnM (result, FreeVars))
-> RnM (result, FreeVars)
rnLocalBindsAndThen HsLocalBinds GhcPs
binds ((HsLocalBinds GhcRn -> FreeVars -> RnM (HsExpr GhcRn, FreeVars))
 -> RnM (HsExpr GhcRn, FreeVars))
-> (HsLocalBinds GhcRn -> FreeVars -> RnM (HsExpr GhcRn, FreeVars))
-> RnM (HsExpr GhcRn, FreeVars)
forall a b. (a -> b) -> a -> b
$ \binds' :: HsLocalBinds GhcRn
binds' _ -> do
      { (expr' :: LHsExpr GhcRn
expr',fvExpr :: FreeVars
fvExpr) <- LHsExpr GhcPs -> RnM (LHsExpr GhcRn, FreeVars)
rnLExpr LHsExpr GhcPs
expr
      ; (HsExpr GhcRn, FreeVars) -> RnM (HsExpr GhcRn, FreeVars)
forall (m :: * -> *) a. Monad m => a -> m a
return (XLet GhcRn -> LHsLocalBinds GhcRn -> LHsExpr GhcRn -> HsExpr GhcRn
forall p. XLet p -> LHsLocalBinds p -> LHsExpr p -> HsExpr p
HsLet XLet GhcPs
XLet GhcRn
x (SrcSpan -> HsLocalBinds GhcRn -> LHsLocalBinds GhcRn
forall l e. l -> e -> GenLocated l e
L SrcSpan
l HsLocalBinds GhcRn
binds') LHsExpr GhcRn
expr', FreeVars
fvExpr) }

rnExpr (HsDo x :: XDo GhcPs
x do_or_lc :: HsStmtContext Name
do_or_lc (L l :: SrcSpan
l stmts :: [ExprLStmt GhcPs]
stmts))
  = do  { ((stmts' :: [LStmt GhcRn (LHsExpr GhcRn)]
stmts', _), fvs :: FreeVars
fvs) <-
           HsStmtContext Name
-> (LHsExpr GhcPs -> RnM (LHsExpr GhcRn, FreeVars))
-> (HsStmtContext Name
    -> [(LStmt GhcRn (LHsExpr GhcRn), FreeVars)]
    -> RnM ([LStmt GhcRn (LHsExpr GhcRn)], FreeVars))
-> [ExprLStmt GhcPs]
-> ([Name] -> RnM ((), FreeVars))
-> RnM (([LStmt GhcRn (LHsExpr GhcRn)], ()), FreeVars)
forall (body :: * -> *) thing.
Outputable (body GhcPs) =>
HsStmtContext Name
-> (Located (body GhcPs) -> RnM (Located (body GhcRn), FreeVars))
-> (HsStmtContext Name
    -> [(LStmt GhcRn (Located (body GhcRn)), FreeVars)]
    -> RnM ([LStmt GhcRn (Located (body GhcRn))], FreeVars))
-> [LStmt GhcPs (Located (body GhcPs))]
-> ([Name] -> RnM (thing, FreeVars))
-> RnM (([LStmt GhcRn (Located (body GhcRn))], thing), FreeVars)
rnStmtsWithPostProcessing HsStmtContext Name
do_or_lc LHsExpr GhcPs -> RnM (LHsExpr GhcRn, FreeVars)
rnLExpr
             HsStmtContext Name
-> [(LStmt GhcRn (LHsExpr GhcRn), FreeVars)]
-> RnM ([LStmt GhcRn (LHsExpr GhcRn)], FreeVars)
postProcessStmtsForApplicativeDo [ExprLStmt GhcPs]
stmts
             (\ _ -> ((), FreeVars) -> RnM ((), FreeVars)
forall (m :: * -> *) a. Monad m => a -> m a
return ((), FreeVars
emptyFVs))
        ; (HsExpr GhcRn, FreeVars) -> RnM (HsExpr GhcRn, FreeVars)
forall (m :: * -> *) a. Monad m => a -> m a
return ( XDo GhcRn
-> HsStmtContext Name
-> Located [LStmt GhcRn (LHsExpr GhcRn)]
-> HsExpr GhcRn
forall p.
XDo p -> HsStmtContext Name -> Located [ExprLStmt p] -> HsExpr p
HsDo XDo GhcPs
XDo GhcRn
x HsStmtContext Name
do_or_lc (SrcSpan
-> [LStmt GhcRn (LHsExpr GhcRn)]
-> Located [LStmt GhcRn (LHsExpr GhcRn)]
forall l e. l -> e -> GenLocated l e
L SrcSpan
l [LStmt GhcRn (LHsExpr GhcRn)]
stmts'), FreeVars
fvs ) }

rnExpr (ExplicitList x :: XExplicitList GhcPs
x _  exps :: [LHsExpr GhcPs]
exps)
  = do  { Bool
opt_OverloadedLists <- Extension -> TcRnIf TcGblEnv TcLclEnv Bool
forall gbl lcl. Extension -> TcRnIf gbl lcl Bool
xoptM Extension
LangExt.OverloadedLists
        ; (exps' :: [LHsExpr GhcRn]
exps', fvs :: FreeVars
fvs) <- [LHsExpr GhcPs] -> RnM ([LHsExpr GhcRn], FreeVars)
rnExprs [LHsExpr GhcPs]
exps
        ; if Bool
opt_OverloadedLists
           then do {
            ; (from_list_n_name :: SyntaxExpr GhcRn
from_list_n_name, fvs' :: FreeVars
fvs') <- Name -> RnM (SyntaxExpr GhcRn, FreeVars)
lookupSyntaxName Name
fromListNName
            ; (HsExpr GhcRn, FreeVars) -> RnM (HsExpr GhcRn, FreeVars)
forall (m :: * -> *) a. Monad m => a -> m a
return (XExplicitList GhcRn
-> Maybe (SyntaxExpr GhcRn) -> [LHsExpr GhcRn] -> HsExpr GhcRn
forall p.
XExplicitList p -> Maybe (SyntaxExpr p) -> [LHsExpr p] -> HsExpr p
ExplicitList XExplicitList GhcPs
XExplicitList GhcRn
x (SyntaxExpr GhcRn -> Maybe (SyntaxExpr GhcRn)
forall a. a -> Maybe a
Just SyntaxExpr GhcRn
from_list_n_name) [LHsExpr GhcRn]
exps'
                     , FreeVars
fvs FreeVars -> FreeVars -> FreeVars
`plusFV` FreeVars
fvs') }
           else
            (HsExpr GhcRn, FreeVars) -> RnM (HsExpr GhcRn, FreeVars)
forall (m :: * -> *) a. Monad m => a -> m a
return  (XExplicitList GhcRn
-> Maybe (SyntaxExpr GhcRn) -> [LHsExpr GhcRn] -> HsExpr GhcRn
forall p.
XExplicitList p -> Maybe (SyntaxExpr p) -> [LHsExpr p] -> HsExpr p
ExplicitList XExplicitList GhcPs
XExplicitList GhcRn
x Maybe (SyntaxExpr GhcRn)
forall a. Maybe a
Nothing [LHsExpr GhcRn]
exps', FreeVars
fvs) }

rnExpr (ExplicitTuple x :: XExplicitTuple GhcPs
x tup_args :: [LHsTupArg GhcPs]
tup_args boxity :: Boxity
boxity)
  = do { [LHsTupArg GhcPs] -> IOEnv (Env TcGblEnv TcLclEnv) ()
checkTupleSection [LHsTupArg GhcPs]
tup_args
       ; Int -> IOEnv (Env TcGblEnv TcLclEnv) ()
checkTupSize ([LHsTupArg GhcPs] -> Int
forall (t :: * -> *) a. Foldable t => t a -> Int
length [LHsTupArg GhcPs]
tup_args)
       ; (tup_args' :: [GenLocated SrcSpan (HsTupArg GhcRn)]
tup_args', fvs :: [FreeVars]
fvs) <- (LHsTupArg GhcPs
 -> IOEnv
      (Env TcGblEnv TcLclEnv)
      (GenLocated SrcSpan (HsTupArg GhcRn), FreeVars))
-> [LHsTupArg GhcPs]
-> IOEnv
     (Env TcGblEnv TcLclEnv)
     ([GenLocated SrcSpan (HsTupArg GhcRn)], [FreeVars])
forall (m :: * -> *) a b c.
Applicative m =>
(a -> m (b, c)) -> [a] -> m ([b], [c])
mapAndUnzipM LHsTupArg GhcPs
-> IOEnv
     (Env TcGblEnv TcLclEnv)
     (GenLocated SrcSpan (HsTupArg GhcRn), FreeVars)
forall l.
GenLocated l (HsTupArg GhcPs)
-> IOEnv
     (Env TcGblEnv TcLclEnv) (GenLocated l (HsTupArg GhcRn), FreeVars)
rnTupArg [LHsTupArg GhcPs]
tup_args
       ; (HsExpr GhcRn, FreeVars) -> RnM (HsExpr GhcRn, FreeVars)
forall (m :: * -> *) a. Monad m => a -> m a
return (XExplicitTuple GhcRn
-> [GenLocated SrcSpan (HsTupArg GhcRn)] -> Boxity -> HsExpr GhcRn
forall p. XExplicitTuple p -> [LHsTupArg p] -> Boxity -> HsExpr p
ExplicitTuple XExplicitTuple GhcPs
XExplicitTuple GhcRn
x [GenLocated SrcSpan (HsTupArg GhcRn)]
tup_args' Boxity
boxity, [FreeVars] -> FreeVars
plusFVs [FreeVars]
fvs) }
  where
    rnTupArg :: GenLocated l (HsTupArg GhcPs)
-> IOEnv
     (Env TcGblEnv TcLclEnv) (GenLocated l (HsTupArg GhcRn), FreeVars)
rnTupArg (L l :: l
l (Present x :: XPresent GhcPs
x e :: LHsExpr GhcPs
e)) = do { (e' :: LHsExpr GhcRn
e',fvs :: FreeVars
fvs) <- LHsExpr GhcPs -> RnM (LHsExpr GhcRn, FreeVars)
rnLExpr LHsExpr GhcPs
e
                                      ; (GenLocated l (HsTupArg GhcRn), FreeVars)
-> IOEnv
     (Env TcGblEnv TcLclEnv) (GenLocated l (HsTupArg GhcRn), FreeVars)
forall (m :: * -> *) a. Monad m => a -> m a
return (l -> HsTupArg GhcRn -> GenLocated l (HsTupArg GhcRn)
forall l e. l -> e -> GenLocated l e
L l
l (XPresent GhcRn -> LHsExpr GhcRn -> HsTupArg GhcRn
forall id. XPresent id -> LHsExpr id -> HsTupArg id
Present XPresent GhcPs
XPresent GhcRn
x LHsExpr GhcRn
e'), FreeVars
fvs) }
    rnTupArg (L l :: l
l (Missing _)) = (GenLocated l (HsTupArg GhcRn), FreeVars)
-> IOEnv
     (Env TcGblEnv TcLclEnv) (GenLocated l (HsTupArg GhcRn), FreeVars)
forall (m :: * -> *) a. Monad m => a -> m a
return (l -> HsTupArg GhcRn -> GenLocated l (HsTupArg GhcRn)
forall l e. l -> e -> GenLocated l e
L l
l (XMissing GhcRn -> HsTupArg GhcRn
forall id. XMissing id -> HsTupArg id
Missing XMissing GhcRn
NoExt
noExt)
                                        , FreeVars
emptyFVs)
    rnTupArg (L _ (XTupArg {})) = String
-> IOEnv
     (Env TcGblEnv TcLclEnv) (GenLocated l (HsTupArg GhcRn), FreeVars)
forall a. String -> a
panic "rnExpr.XTupArg"

rnExpr (ExplicitSum x :: XExplicitSum GhcPs
x alt :: Int
alt arity :: Int
arity expr :: LHsExpr GhcPs
expr)
  = do { (expr' :: LHsExpr GhcRn
expr', fvs :: FreeVars
fvs) <- LHsExpr GhcPs -> RnM (LHsExpr GhcRn, FreeVars)
rnLExpr LHsExpr GhcPs
expr
       ; (HsExpr GhcRn, FreeVars) -> RnM (HsExpr GhcRn, FreeVars)
forall (m :: * -> *) a. Monad m => a -> m a
return (XExplicitSum GhcRn -> Int -> Int -> LHsExpr GhcRn -> HsExpr GhcRn
forall p. XExplicitSum p -> Int -> Int -> LHsExpr p -> HsExpr p
ExplicitSum XExplicitSum GhcPs
XExplicitSum GhcRn
x Int
alt Int
arity LHsExpr GhcRn
expr', FreeVars
fvs) }

rnExpr (RecordCon { rcon_con_name :: forall p. HsExpr p -> Located (IdP p)
rcon_con_name = GenLocated SrcSpan (IdP GhcPs)
con_id
                  , rcon_flds :: forall p. HsExpr p -> HsRecordBinds p
rcon_flds = rec_binds :: HsRecordBinds GhcPs
rec_binds@(HsRecFields { rec_dotdot :: forall p arg. HsRecFields p arg -> Maybe Int
rec_dotdot = Maybe Int
dd }) })
  = do { con_lname :: Located Name
con_lname@(L _ con_name :: Name
con_name) <- Located RdrName -> RnM (Located Name)
lookupLocatedOccRn Located RdrName
GenLocated SrcSpan (IdP GhcPs)
con_id
       ; (flds :: [LHsRecField GhcRn (LHsExpr GhcPs)]
flds, fvs :: FreeVars
fvs)   <- HsRecFieldContext
-> (SrcSpan -> RdrName -> SrcSpanLess (LHsExpr GhcPs))
-> HsRecordBinds GhcPs
-> RnM ([LHsRecField GhcRn (LHsExpr GhcPs)], FreeVars)
forall arg.
HasSrcSpan arg =>
HsRecFieldContext
-> (SrcSpan -> RdrName -> SrcSpanLess arg)
-> HsRecFields GhcPs arg
-> RnM ([LHsRecField GhcRn arg], FreeVars)
rnHsRecFields (Name -> HsRecFieldContext
HsRecFieldCon Name
con_name) SrcSpan -> RdrName -> SrcSpanLess (LHsExpr GhcPs)
forall p. (XVar p ~ NoExt) => SrcSpan -> IdP p -> HsExpr p
mk_hs_var HsRecordBinds GhcPs
rec_binds
       ; (flds' :: [GenLocated SrcSpan (HsRecField' (FieldOcc GhcRn) (LHsExpr GhcRn))]
flds', fvss :: [FreeVars]
fvss) <- (LHsRecField GhcRn (LHsExpr GhcPs)
 -> IOEnv
      (Env TcGblEnv TcLclEnv)
      (GenLocated SrcSpan (HsRecField' (FieldOcc GhcRn) (LHsExpr GhcRn)),
       FreeVars))
-> [LHsRecField GhcRn (LHsExpr GhcPs)]
-> IOEnv
     (Env TcGblEnv TcLclEnv)
     ([GenLocated
         SrcSpan (HsRecField' (FieldOcc GhcRn) (LHsExpr GhcRn))],
      [FreeVars])
forall (m :: * -> *) a b c.
Applicative m =>
(a -> m (b, c)) -> [a] -> m ([b], [c])
mapAndUnzipM LHsRecField GhcRn (LHsExpr GhcPs)
-> IOEnv
     (Env TcGblEnv TcLclEnv)
     (GenLocated SrcSpan (HsRecField' (FieldOcc GhcRn) (LHsExpr GhcRn)),
      FreeVars)
forall l id.
GenLocated l (HsRecField' id (LHsExpr GhcPs))
-> IOEnv
     (Env TcGblEnv TcLclEnv)
     (GenLocated l (HsRecField' id (LHsExpr GhcRn)), FreeVars)
rn_field [LHsRecField GhcRn (LHsExpr GhcPs)]
flds
       ; let rec_binds' :: HsRecFields GhcRn (LHsExpr GhcRn)
rec_binds' = HsRecFields :: forall p arg. [LHsRecField p arg] -> Maybe Int -> HsRecFields p arg
HsRecFields { rec_flds :: [GenLocated SrcSpan (HsRecField' (FieldOcc GhcRn) (LHsExpr GhcRn))]
rec_flds = [GenLocated SrcSpan (HsRecField' (FieldOcc GhcRn) (LHsExpr GhcRn))]
flds', rec_dotdot :: Maybe Int
rec_dotdot = Maybe Int
dd }
       ; (HsExpr GhcRn, FreeVars) -> RnM (HsExpr GhcRn, FreeVars)
forall (m :: * -> *) a. Monad m => a -> m a
return (RecordCon :: forall p.
XRecordCon p -> Located (IdP p) -> HsRecordBinds p -> HsExpr p
RecordCon { rcon_ext :: XRecordCon GhcRn
rcon_ext = XRecordCon GhcRn
NoExt
noExt
                           , rcon_con_name :: Located (IdP GhcRn)
rcon_con_name = Located Name
Located (IdP GhcRn)
con_lname, rcon_flds :: HsRecFields GhcRn (LHsExpr GhcRn)
rcon_flds = HsRecFields GhcRn (LHsExpr GhcRn)
rec_binds' }
                , FreeVars
fvs FreeVars -> FreeVars -> FreeVars
`plusFV` [FreeVars] -> FreeVars
plusFVs [FreeVars]
fvss FreeVars -> Name -> FreeVars
`addOneFV` Name
con_name) }
  where
    mk_hs_var :: SrcSpan -> IdP p -> HsExpr p
mk_hs_var l :: SrcSpan
l n :: IdP p
n = XVar p -> Located (IdP p) -> HsExpr p
forall p. XVar p -> Located (IdP p) -> HsExpr p
HsVar XVar p
NoExt
noExt (SrcSpan -> IdP p -> Located (IdP p)
forall l e. l -> e -> GenLocated l e
L SrcSpan
l IdP p
n)
    rn_field :: GenLocated l (HsRecField' id (LHsExpr GhcPs))
-> IOEnv
     (Env TcGblEnv TcLclEnv)
     (GenLocated l (HsRecField' id (LHsExpr GhcRn)), FreeVars)
rn_field (L l :: l
l fld :: HsRecField' id (LHsExpr GhcPs)
fld) = do { (arg' :: LHsExpr GhcRn
arg', fvs :: FreeVars
fvs) <- LHsExpr GhcPs -> RnM (LHsExpr GhcRn, FreeVars)
rnLExpr (HsRecField' id (LHsExpr GhcPs) -> LHsExpr GhcPs
forall id arg. HsRecField' id arg -> arg
hsRecFieldArg HsRecField' id (LHsExpr GhcPs)
fld)
                            ; (GenLocated l (HsRecField' id (LHsExpr GhcRn)), FreeVars)
-> IOEnv
     (Env TcGblEnv TcLclEnv)
     (GenLocated l (HsRecField' id (LHsExpr GhcRn)), FreeVars)
forall (m :: * -> *) a. Monad m => a -> m a
return (l
-> HsRecField' id (LHsExpr GhcRn)
-> GenLocated l (HsRecField' id (LHsExpr GhcRn))
forall l e. l -> e -> GenLocated l e
L l
l (HsRecField' id (LHsExpr GhcPs)
fld { hsRecFieldArg :: LHsExpr GhcRn
hsRecFieldArg = LHsExpr GhcRn
arg' }), FreeVars
fvs) }

rnExpr (RecordUpd { rupd_expr :: forall p. HsExpr p -> LHsExpr p
rupd_expr = LHsExpr GhcPs
expr, rupd_flds :: forall p. HsExpr p -> [LHsRecUpdField p]
rupd_flds = [LHsRecUpdField GhcPs]
rbinds })
  = do  { (expr' :: LHsExpr GhcRn
expr', fvExpr :: FreeVars
fvExpr) <- LHsExpr GhcPs -> RnM (LHsExpr GhcRn, FreeVars)
rnLExpr LHsExpr GhcPs
expr
        ; (rbinds' :: [LHsRecUpdField GhcRn]
rbinds', fvRbinds :: FreeVars
fvRbinds) <- [LHsRecUpdField GhcPs] -> RnM ([LHsRecUpdField GhcRn], FreeVars)
rnHsRecUpdFields [LHsRecUpdField GhcPs]
rbinds
        ; (HsExpr GhcRn, FreeVars) -> RnM (HsExpr GhcRn, FreeVars)
forall (m :: * -> *) a. Monad m => a -> m a
return (RecordUpd :: forall p.
XRecordUpd p -> LHsExpr p -> [LHsRecUpdField p] -> HsExpr p
RecordUpd { rupd_ext :: XRecordUpd GhcRn
rupd_ext = XRecordUpd GhcRn
NoExt
noExt, rupd_expr :: LHsExpr GhcRn
rupd_expr = LHsExpr GhcRn
expr'
                            , rupd_flds :: [LHsRecUpdField GhcRn]
rupd_flds = [LHsRecUpdField GhcRn]
rbinds' }
                 , FreeVars
fvExpr FreeVars -> FreeVars -> FreeVars
`plusFV` FreeVars
fvRbinds) }

rnExpr (ExprWithTySig _ expr :: LHsExpr GhcPs
expr pty :: LHsSigWcType (NoGhcTc GhcPs)
pty)
  = do  { (pty' :: LHsSigWcType GhcRn
pty', fvTy :: FreeVars
fvTy)    <- HsSigWcTypeScoping
-> HsDocContext
-> LHsSigWcType GhcPs
-> RnM (LHsSigWcType GhcRn, FreeVars)
rnHsSigWcType HsSigWcTypeScoping
BindUnlessForall HsDocContext
ExprWithTySigCtx LHsSigWcType (NoGhcTc GhcPs)
LHsSigWcType GhcPs
pty
        ; (expr' :: LHsExpr GhcRn
expr', fvExpr :: FreeVars
fvExpr) <- [Name]
-> RnM (LHsExpr GhcRn, FreeVars) -> RnM (LHsExpr GhcRn, FreeVars)
forall a. [Name] -> RnM (a, FreeVars) -> RnM (a, FreeVars)
bindSigTyVarsFV (LHsSigWcType GhcRn -> [Name]
hsWcScopedTvs LHsSigWcType GhcRn
pty') (RnM (LHsExpr GhcRn, FreeVars) -> RnM (LHsExpr GhcRn, FreeVars))
-> RnM (LHsExpr GhcRn, FreeVars) -> RnM (LHsExpr GhcRn, FreeVars)
forall a b. (a -> b) -> a -> b
$
                             LHsExpr GhcPs -> RnM (LHsExpr GhcRn, FreeVars)
rnLExpr LHsExpr GhcPs
expr
        ; (HsExpr GhcRn, FreeVars) -> RnM (HsExpr GhcRn, FreeVars)
forall (m :: * -> *) a. Monad m => a -> m a
return (XExprWithTySig GhcRn
-> LHsExpr GhcRn -> LHsSigWcType (NoGhcTc GhcRn) -> HsExpr GhcRn
forall p.
XExprWithTySig p
-> LHsExpr p -> LHsSigWcType (NoGhcTc p) -> HsExpr p
ExprWithTySig XExprWithTySig GhcRn
NoExt
noExt LHsExpr GhcRn
expr' LHsSigWcType (NoGhcTc GhcRn)
LHsSigWcType GhcRn
pty', FreeVars
fvExpr FreeVars -> FreeVars -> FreeVars
`plusFV` FreeVars
fvTy) }

rnExpr (HsIf x :: XIf GhcPs
x _ p :: LHsExpr GhcPs
p b1 :: LHsExpr GhcPs
b1 b2 :: LHsExpr GhcPs
b2)
  = do { (p' :: LHsExpr GhcRn
p', fvP :: FreeVars
fvP) <- LHsExpr GhcPs -> RnM (LHsExpr GhcRn, FreeVars)
rnLExpr LHsExpr GhcPs
p
       ; (b1' :: LHsExpr GhcRn
b1', fvB1 :: FreeVars
fvB1) <- LHsExpr GhcPs -> RnM (LHsExpr GhcRn, FreeVars)
rnLExpr LHsExpr GhcPs
b1
       ; (b2' :: LHsExpr GhcRn
b2', fvB2 :: FreeVars
fvB2) <- LHsExpr GhcPs -> RnM (LHsExpr GhcRn, FreeVars)
rnLExpr LHsExpr GhcPs
b2
       ; (mb_ite :: Maybe (SyntaxExpr GhcRn)
mb_ite, fvITE :: FreeVars
fvITE) <- RnM (Maybe (SyntaxExpr GhcRn), FreeVars)
lookupIfThenElse
       ; (HsExpr GhcRn, FreeVars) -> RnM (HsExpr GhcRn, FreeVars)
forall (m :: * -> *) a. Monad m => a -> m a
return (XIf GhcRn
-> Maybe (SyntaxExpr GhcRn)
-> LHsExpr GhcRn
-> LHsExpr GhcRn
-> LHsExpr GhcRn
-> HsExpr GhcRn
forall p.
XIf p
-> Maybe (SyntaxExpr p)
-> LHsExpr p
-> LHsExpr p
-> LHsExpr p
-> HsExpr p
HsIf XIf GhcPs
XIf GhcRn
x Maybe (SyntaxExpr GhcRn)
mb_ite LHsExpr GhcRn
p' LHsExpr GhcRn
b1' LHsExpr GhcRn
b2', [FreeVars] -> FreeVars
plusFVs [FreeVars
fvITE, FreeVars
fvP, FreeVars
fvB1, FreeVars
fvB2]) }

rnExpr (HsMultiIf x :: XMultiIf GhcPs
x alts :: [LGRHS GhcPs (LHsExpr GhcPs)]
alts)
  = do { (alts' :: [LGRHS GhcRn (LHsExpr GhcRn)]
alts', fvs :: FreeVars
fvs) <- (LGRHS GhcPs (LHsExpr GhcPs)
 -> RnM (LGRHS GhcRn (LHsExpr GhcRn), FreeVars))
-> [LGRHS GhcPs (LHsExpr GhcPs)]
-> RnM ([LGRHS GhcRn (LHsExpr GhcRn)], FreeVars)
forall a b. (a -> RnM (b, FreeVars)) -> [a] -> RnM ([b], FreeVars)
mapFvRn (HsMatchContext Name
-> (LHsExpr GhcPs -> RnM (LHsExpr GhcRn, FreeVars))
-> LGRHS GhcPs (LHsExpr GhcPs)
-> RnM (LGRHS GhcRn (LHsExpr GhcRn), FreeVars)
forall (body :: * -> *).
HsMatchContext Name
-> (Located (body GhcPs) -> RnM (Located (body GhcRn), FreeVars))
-> LGRHS GhcPs (Located (body GhcPs))
-> RnM (LGRHS GhcRn (Located (body GhcRn)), FreeVars)
rnGRHS HsMatchContext Name
forall id. HsMatchContext id
IfAlt LHsExpr GhcPs -> RnM (LHsExpr GhcRn, FreeVars)
rnLExpr) [LGRHS GhcPs (LHsExpr GhcPs)]
alts
       -- ; return (HsMultiIf ty alts', fvs) }
       ; (HsExpr GhcRn, FreeVars) -> RnM (HsExpr GhcRn, FreeVars)
forall (m :: * -> *) a. Monad m => a -> m a
return (XMultiIf GhcRn -> [LGRHS GhcRn (LHsExpr GhcRn)] -> HsExpr GhcRn
forall p. XMultiIf p -> [LGRHS p (LHsExpr p)] -> HsExpr p
HsMultiIf XMultiIf GhcPs
XMultiIf GhcRn
x [LGRHS GhcRn (LHsExpr GhcRn)]
alts', FreeVars
fvs) }

rnExpr (ArithSeq x :: XArithSeq GhcPs
x _ seq :: ArithSeqInfo GhcPs
seq)
  = do { Bool
opt_OverloadedLists <- Extension -> TcRnIf TcGblEnv TcLclEnv Bool
forall gbl lcl. Extension -> TcRnIf gbl lcl Bool
xoptM Extension
LangExt.OverloadedLists
       ; (new_seq :: ArithSeqInfo GhcRn
new_seq, fvs :: FreeVars
fvs) <- ArithSeqInfo GhcPs -> RnM (ArithSeqInfo GhcRn, FreeVars)
rnArithSeq ArithSeqInfo GhcPs
seq
       ; if Bool
opt_OverloadedLists
           then do {
            ; (from_list_name :: SyntaxExpr GhcRn
from_list_name, fvs' :: FreeVars
fvs') <- Name -> RnM (SyntaxExpr GhcRn, FreeVars)
lookupSyntaxName Name
fromListName
            ; (HsExpr GhcRn, FreeVars) -> RnM (HsExpr GhcRn, FreeVars)
forall (m :: * -> *) a. Monad m => a -> m a
return (XArithSeq GhcRn
-> Maybe (SyntaxExpr GhcRn) -> ArithSeqInfo GhcRn -> HsExpr GhcRn
forall p.
XArithSeq p -> Maybe (SyntaxExpr p) -> ArithSeqInfo p -> HsExpr p
ArithSeq XArithSeq GhcPs
XArithSeq GhcRn
x (SyntaxExpr GhcRn -> Maybe (SyntaxExpr GhcRn)
forall a. a -> Maybe a
Just SyntaxExpr GhcRn
from_list_name) ArithSeqInfo GhcRn
new_seq
                     , FreeVars
fvs FreeVars -> FreeVars -> FreeVars
`plusFV` FreeVars
fvs') }
           else
            (HsExpr GhcRn, FreeVars) -> RnM (HsExpr GhcRn, FreeVars)
forall (m :: * -> *) a. Monad m => a -> m a
return (XArithSeq GhcRn
-> Maybe (SyntaxExpr GhcRn) -> ArithSeqInfo GhcRn -> HsExpr GhcRn
forall p.
XArithSeq p -> Maybe (SyntaxExpr p) -> ArithSeqInfo p -> HsExpr p
ArithSeq XArithSeq GhcPs
XArithSeq GhcRn
x Maybe (SyntaxExpr GhcRn)
forall a. Maybe a
Nothing ArithSeqInfo GhcRn
new_seq, FreeVars
fvs) }

{-
These three are pattern syntax appearing in expressions.
Since all the symbols are reservedops we can simply reject them.
We return a (bogus) EWildPat in each case.
-}

rnExpr (EWildPat _)  = (HsExpr GhcRn, FreeVars) -> RnM (HsExpr GhcRn, FreeVars)
forall (m :: * -> *) a. Monad m => a -> m a
return (HsExpr GhcRn
forall (id :: Pass). HsExpr (GhcPass id)
hsHoleExpr, FreeVars
emptyFVs)   -- "_" is just a hole
rnExpr e :: HsExpr GhcPs
e@(EAsPat {})
  = do { Bool
opt_TypeApplications <- Extension -> TcRnIf TcGblEnv TcLclEnv Bool
forall gbl lcl. Extension -> TcRnIf gbl lcl Bool
xoptM Extension
LangExt.TypeApplications
       ; let msg :: String
msg | Bool
opt_TypeApplications
                    = "Type application syntax requires a space before '@'"
                 | Bool
otherwise
                    = "Did you mean to enable TypeApplications?"
       ; HsExpr GhcPs -> MsgDoc -> RnM (HsExpr GhcRn, FreeVars)
patSynErr HsExpr GhcPs
e (String -> MsgDoc
text String
msg)
       }
rnExpr e :: HsExpr GhcPs
e@(EViewPat {}) = HsExpr GhcPs -> MsgDoc -> RnM (HsExpr GhcRn, FreeVars)
patSynErr HsExpr GhcPs
e MsgDoc
empty
rnExpr e :: HsExpr GhcPs
e@(ELazyPat {}) = HsExpr GhcPs -> MsgDoc -> RnM (HsExpr GhcRn, FreeVars)
patSynErr HsExpr GhcPs
e MsgDoc
empty

{-
************************************************************************
*                                                                      *
        Static values
*                                                                      *
************************************************************************

For the static form we check that it is not used in splices.
We also collect the free variables of the term which come from
this module. See Note [Grand plan for static forms] in StaticPtrTable.
-}

rnExpr e :: HsExpr GhcPs
e@(HsStatic _ expr :: LHsExpr GhcPs
expr) = do
    -- Normally, you wouldn't be able to construct a static expression without
    -- first enabling -XStaticPointers in the first place, since that extension
    -- is what makes the parser treat `static` as a keyword. But this is not a
    -- sufficient safeguard, as one can construct static expressions by another
    -- mechanism: Template Haskell (see #14204). To ensure that GHC is
    -- absolutely prepared to cope with static forms, we check for
    -- -XStaticPointers here as well.
    Extension
-> IOEnv (Env TcGblEnv TcLclEnv) ()
-> IOEnv (Env TcGblEnv TcLclEnv) ()
forall gbl lcl. Extension -> TcRnIf gbl lcl () -> TcRnIf gbl lcl ()
unlessXOptM Extension
LangExt.StaticPointers (IOEnv (Env TcGblEnv TcLclEnv) ()
 -> IOEnv (Env TcGblEnv TcLclEnv) ())
-> IOEnv (Env TcGblEnv TcLclEnv) ()
-> IOEnv (Env TcGblEnv TcLclEnv) ()
forall a b. (a -> b) -> a -> b
$
      MsgDoc -> IOEnv (Env TcGblEnv TcLclEnv) ()
addErr (MsgDoc -> IOEnv (Env TcGblEnv TcLclEnv) ())
-> MsgDoc -> IOEnv (Env TcGblEnv TcLclEnv) ()
forall a b. (a -> b) -> a -> b
$ MsgDoc -> Int -> MsgDoc -> MsgDoc
hang (String -> MsgDoc
text "Illegal static expression:" MsgDoc -> MsgDoc -> MsgDoc
<+> HsExpr GhcPs -> MsgDoc
forall a. Outputable a => a -> MsgDoc
ppr HsExpr GhcPs
e)
                  2 (String -> MsgDoc
text "Use StaticPointers to enable this extension")
    (expr' :: LHsExpr GhcRn
expr',fvExpr :: FreeVars
fvExpr) <- LHsExpr GhcPs -> RnM (LHsExpr GhcRn, FreeVars)
rnLExpr LHsExpr GhcPs
expr
    ThStage
stage <- TcM ThStage
getStage
    case ThStage
stage of
      Splice _ -> MsgDoc -> IOEnv (Env TcGblEnv TcLclEnv) ()
addErr (MsgDoc -> IOEnv (Env TcGblEnv TcLclEnv) ())
-> MsgDoc -> IOEnv (Env TcGblEnv TcLclEnv) ()
forall a b. (a -> b) -> a -> b
$ [MsgDoc] -> MsgDoc
sep
             [ String -> MsgDoc
text "static forms cannot be used in splices:"
             , Int -> MsgDoc -> MsgDoc
nest 2 (MsgDoc -> MsgDoc) -> MsgDoc -> MsgDoc
forall a b. (a -> b) -> a -> b
$ HsExpr GhcPs -> MsgDoc
forall a. Outputable a => a -> MsgDoc
ppr HsExpr GhcPs
e
             ]
      _ -> () -> IOEnv (Env TcGblEnv TcLclEnv) ()
forall (m :: * -> *) a. Monad m => a -> m a
return ()
    Module
mod <- IOEnv (Env TcGblEnv TcLclEnv) Module
forall (m :: * -> *). HasModule m => m Module
getModule
    let fvExpr' :: FreeVars
fvExpr' = (Name -> Bool) -> FreeVars -> FreeVars
filterNameSet (Module -> Name -> Bool
nameIsLocalOrFrom Module
mod) FreeVars
fvExpr
    (HsExpr GhcRn, FreeVars) -> RnM (HsExpr GhcRn, FreeVars)
forall (m :: * -> *) a. Monad m => a -> m a
return (XStatic GhcRn -> LHsExpr GhcRn -> HsExpr GhcRn
forall p. XStatic p -> LHsExpr p -> HsExpr p
HsStatic FreeVars
XStatic GhcRn
fvExpr' LHsExpr GhcRn
expr', FreeVars
fvExpr)

{-
************************************************************************
*                                                                      *
        Arrow notation
*                                                                      *
************************************************************************
-}

rnExpr (HsProc x :: XProc GhcPs
x pat :: LPat GhcPs
pat body :: LHsCmdTop GhcPs
body)
  = RnM (HsExpr GhcRn, FreeVars) -> RnM (HsExpr GhcRn, FreeVars)
forall a. TcM a -> TcM a
newArrowScope (RnM (HsExpr GhcRn, FreeVars) -> RnM (HsExpr GhcRn, FreeVars))
-> RnM (HsExpr GhcRn, FreeVars) -> RnM (HsExpr GhcRn, FreeVars)
forall a b. (a -> b) -> a -> b
$
    HsMatchContext Name
-> LPat GhcPs
-> (LPat GhcRn -> RnM (HsExpr GhcRn, FreeVars))
-> RnM (HsExpr GhcRn, FreeVars)
forall a.
HsMatchContext Name
-> LPat GhcPs
-> (LPat GhcRn -> RnM (a, FreeVars))
-> RnM (a, FreeVars)
rnPat HsMatchContext Name
forall id. HsMatchContext id
ProcExpr LPat GhcPs
pat ((LPat GhcRn -> RnM (HsExpr GhcRn, FreeVars))
 -> RnM (HsExpr GhcRn, FreeVars))
-> (LPat GhcRn -> RnM (HsExpr GhcRn, FreeVars))
-> RnM (HsExpr GhcRn, FreeVars)
forall a b. (a -> b) -> a -> b
$ \ pat' :: LPat GhcRn
pat' -> do
      { (body' :: LHsCmdTop GhcRn
body',fvBody :: FreeVars
fvBody) <- LHsCmdTop GhcPs -> RnM (LHsCmdTop GhcRn, FreeVars)
rnCmdTop LHsCmdTop GhcPs
body
      ; (HsExpr GhcRn, FreeVars) -> RnM (HsExpr GhcRn, FreeVars)
forall (m :: * -> *) a. Monad m => a -> m a
return (XProc GhcRn -> LPat GhcRn -> LHsCmdTop GhcRn -> HsExpr GhcRn
forall p. XProc p -> LPat p -> LHsCmdTop p -> HsExpr p
HsProc XProc GhcPs
XProc GhcRn
x LPat GhcRn
pat' LHsCmdTop GhcRn
body', FreeVars
fvBody) }

-- Ideally, these would be done in parsing, but to keep parsing simple, we do it here.
rnExpr e :: HsExpr GhcPs
e@(HsArrApp {})  = HsExpr GhcPs -> RnM (HsExpr GhcRn, FreeVars)
arrowFail HsExpr GhcPs
e
rnExpr e :: HsExpr GhcPs
e@(HsArrForm {}) = HsExpr GhcPs -> RnM (HsExpr GhcRn, FreeVars)
arrowFail HsExpr GhcPs
e

rnExpr other :: HsExpr GhcPs
other = String -> MsgDoc -> RnM (HsExpr GhcRn, FreeVars)
forall a. HasCallStack => String -> MsgDoc -> a
pprPanic "rnExpr: unexpected expression" (HsExpr GhcPs -> MsgDoc
forall a. Outputable a => a -> MsgDoc
ppr HsExpr GhcPs
other)
        -- HsWrap

hsHoleExpr :: HsExpr (GhcPass id)
hsHoleExpr :: HsExpr (GhcPass id)
hsHoleExpr = XUnboundVar (GhcPass id) -> UnboundVar -> HsExpr (GhcPass id)
forall p. XUnboundVar p -> UnboundVar -> HsExpr p
HsUnboundVar XUnboundVar (GhcPass id)
NoExt
noExt (OccName -> UnboundVar
TrueExprHole (String -> OccName
mkVarOcc "_"))

arrowFail :: HsExpr GhcPs -> RnM (HsExpr GhcRn, FreeVars)
arrowFail :: HsExpr GhcPs -> RnM (HsExpr GhcRn, FreeVars)
arrowFail e :: HsExpr GhcPs
e
  = do { MsgDoc -> IOEnv (Env TcGblEnv TcLclEnv) ()
addErr ([MsgDoc] -> MsgDoc
vcat [ String -> MsgDoc
text "Arrow command found where an expression was expected:"
                      , Int -> MsgDoc -> MsgDoc
nest 2 (HsExpr GhcPs -> MsgDoc
forall a. Outputable a => a -> MsgDoc
ppr HsExpr GhcPs
e) ])
         -- Return a place-holder hole, so that we can carry on
         -- to report other errors
       ; (HsExpr GhcRn, FreeVars) -> RnM (HsExpr GhcRn, FreeVars)
forall (m :: * -> *) a. Monad m => a -> m a
return (HsExpr GhcRn
forall (id :: Pass). HsExpr (GhcPass id)
hsHoleExpr, FreeVars
emptyFVs) }

----------------------
-- See Note [Parsing sections] in Parser.y
rnSection :: HsExpr GhcPs -> RnM (HsExpr GhcRn, FreeVars)
rnSection :: HsExpr GhcPs -> RnM (HsExpr GhcRn, FreeVars)
rnSection section :: HsExpr GhcPs
section@(SectionR x :: XSectionR GhcPs
x op :: LHsExpr GhcPs
op expr :: LHsExpr GhcPs
expr)
  = do  { (op' :: LHsExpr GhcRn
op', fvs_op :: FreeVars
fvs_op)     <- LHsExpr GhcPs -> RnM (LHsExpr GhcRn, FreeVars)
rnLExpr LHsExpr GhcPs
op
        ; (expr' :: LHsExpr GhcRn
expr', fvs_expr :: FreeVars
fvs_expr) <- LHsExpr GhcPs -> RnM (LHsExpr GhcRn, FreeVars)
rnLExpr LHsExpr GhcPs
expr
        ; FixityDirection
-> HsExpr GhcPs
-> LHsExpr GhcRn
-> LHsExpr GhcRn
-> IOEnv (Env TcGblEnv TcLclEnv) ()
checkSectionPrec FixityDirection
InfixR HsExpr GhcPs
section LHsExpr GhcRn
op' LHsExpr GhcRn
expr'
        ; (HsExpr GhcRn, FreeVars) -> RnM (HsExpr GhcRn, FreeVars)
forall (m :: * -> *) a. Monad m => a -> m a
return (XSectionR GhcRn -> LHsExpr GhcRn -> LHsExpr GhcRn -> HsExpr GhcRn
forall p. XSectionR p -> LHsExpr p -> LHsExpr p -> HsExpr p
SectionR XSectionR GhcPs
XSectionR GhcRn
x LHsExpr GhcRn
op' LHsExpr GhcRn
expr', FreeVars
fvs_op FreeVars -> FreeVars -> FreeVars
`plusFV` FreeVars
fvs_expr) }

rnSection section :: HsExpr GhcPs
section@(SectionL x :: XSectionL GhcPs
x expr :: LHsExpr GhcPs
expr op :: LHsExpr GhcPs
op)
  = do  { (expr' :: LHsExpr GhcRn
expr', fvs_expr :: FreeVars
fvs_expr) <- LHsExpr GhcPs -> RnM (LHsExpr GhcRn, FreeVars)
rnLExpr LHsExpr GhcPs
expr
        ; (op' :: LHsExpr GhcRn
op', fvs_op :: FreeVars
fvs_op)     <- LHsExpr GhcPs -> RnM (LHsExpr GhcRn, FreeVars)
rnLExpr LHsExpr GhcPs
op
        ; FixityDirection
-> HsExpr GhcPs
-> LHsExpr GhcRn
-> LHsExpr GhcRn
-> IOEnv (Env TcGblEnv TcLclEnv) ()
checkSectionPrec FixityDirection
InfixL HsExpr GhcPs
section LHsExpr GhcRn
op' LHsExpr GhcRn
expr'
        ; (HsExpr GhcRn, FreeVars) -> RnM (HsExpr GhcRn, FreeVars)
forall (m :: * -> *) a. Monad m => a -> m a
return (XSectionL GhcRn -> LHsExpr GhcRn -> LHsExpr GhcRn -> HsExpr GhcRn
forall p. XSectionL p -> LHsExpr p -> LHsExpr p -> HsExpr p
SectionL XSectionL GhcPs
XSectionL GhcRn
x LHsExpr GhcRn
expr' LHsExpr GhcRn
op', FreeVars
fvs_op FreeVars -> FreeVars -> FreeVars
`plusFV` FreeVars
fvs_expr) }

rnSection other :: HsExpr GhcPs
other = String -> MsgDoc -> RnM (HsExpr GhcRn, FreeVars)
forall a. HasCallStack => String -> MsgDoc -> a
pprPanic "rnSection" (HsExpr GhcPs -> MsgDoc
forall a. Outputable a => a -> MsgDoc
ppr HsExpr GhcPs
other)

{-
************************************************************************
*                                                                      *
        Arrow commands
*                                                                      *
************************************************************************
-}

rnCmdArgs :: [LHsCmdTop GhcPs] -> RnM ([LHsCmdTop GhcRn], FreeVars)
rnCmdArgs :: [LHsCmdTop GhcPs] -> RnM ([LHsCmdTop GhcRn], FreeVars)
rnCmdArgs [] = ([LHsCmdTop GhcRn], FreeVars) -> RnM ([LHsCmdTop GhcRn], FreeVars)
forall (m :: * -> *) a. Monad m => a -> m a
return ([], FreeVars
emptyFVs)
rnCmdArgs (arg :: LHsCmdTop GhcPs
arg:args :: [LHsCmdTop GhcPs]
args)
  = do { (arg' :: LHsCmdTop GhcRn
arg',fvArg :: FreeVars
fvArg) <- LHsCmdTop GhcPs -> RnM (LHsCmdTop GhcRn, FreeVars)
rnCmdTop LHsCmdTop GhcPs
arg
       ; (args' :: [LHsCmdTop GhcRn]
args',fvArgs :: FreeVars
fvArgs) <- [LHsCmdTop GhcPs] -> RnM ([LHsCmdTop GhcRn], FreeVars)
rnCmdArgs [LHsCmdTop GhcPs]
args
       ; ([LHsCmdTop GhcRn], FreeVars) -> RnM ([LHsCmdTop GhcRn], FreeVars)
forall (m :: * -> *) a. Monad m => a -> m a
return (LHsCmdTop GhcRn
arg'LHsCmdTop GhcRn -> [LHsCmdTop GhcRn] -> [LHsCmdTop GhcRn]
forall a. a -> [a] -> [a]
:[LHsCmdTop GhcRn]
args', FreeVars
fvArg FreeVars -> FreeVars -> FreeVars
`plusFV` FreeVars
fvArgs) }

rnCmdTop :: LHsCmdTop GhcPs -> RnM (LHsCmdTop GhcRn, FreeVars)
rnCmdTop :: LHsCmdTop GhcPs -> RnM (LHsCmdTop GhcRn, FreeVars)
rnCmdTop = (SrcSpanLess (LHsCmdTop GhcPs)
 -> TcM (SrcSpanLess (LHsCmdTop GhcRn), FreeVars))
-> LHsCmdTop GhcPs -> RnM (LHsCmdTop GhcRn, FreeVars)
forall a b c.
(HasSrcSpan a, HasSrcSpan b) =>
(SrcSpanLess a -> TcM (SrcSpanLess b, c)) -> a -> TcM (b, c)
wrapLocFstM SrcSpanLess (LHsCmdTop GhcPs)
-> TcM (SrcSpanLess (LHsCmdTop GhcRn), FreeVars)
HsCmdTop GhcPs
-> IOEnv (Env TcGblEnv TcLclEnv) (HsCmdTop GhcRn, FreeVars)
rnCmdTop'
 where
  rnCmdTop' :: HsCmdTop GhcPs
-> IOEnv (Env TcGblEnv TcLclEnv) (HsCmdTop GhcRn, FreeVars)
rnCmdTop' (HsCmdTop _ cmd :: LHsCmd GhcPs
cmd)
   = do { (cmd' :: LHsCmd GhcRn
cmd', fvCmd :: FreeVars
fvCmd) <- LHsCmd GhcPs -> RnM (LHsCmd GhcRn, FreeVars)
rnLCmd LHsCmd GhcPs
cmd
        ; let cmd_names :: [Name]
cmd_names = [Name
arrAName, Name
composeAName, Name
firstAName] [Name] -> [Name] -> [Name]
forall a. [a] -> [a] -> [a]
++
                          FreeVars -> [Name]
nameSetElemsStable (HsCmd GhcRn -> FreeVars
methodNamesCmd (LHsCmd GhcRn -> SrcSpanLess (LHsCmd GhcRn)
forall a. HasSrcSpan a => a -> SrcSpanLess a
unLoc LHsCmd GhcRn
cmd'))
        -- Generate the rebindable syntax for the monad
        ; (cmd_names' :: [HsExpr GhcRn]
cmd_names', cmd_fvs :: FreeVars
cmd_fvs) <- [Name] -> RnM ([HsExpr GhcRn], FreeVars)
lookupSyntaxNames [Name]
cmd_names

        ; (HsCmdTop GhcRn, FreeVars)
-> IOEnv (Env TcGblEnv TcLclEnv) (HsCmdTop GhcRn, FreeVars)
forall (m :: * -> *) a. Monad m => a -> m a
return (XCmdTop GhcRn -> LHsCmd GhcRn -> HsCmdTop GhcRn
forall p. XCmdTop p -> LHsCmd p -> HsCmdTop p
HsCmdTop ([Name]
cmd_names [Name] -> [HsExpr GhcRn] -> [(Name, HsExpr GhcRn)]
forall a b. [a] -> [b] -> [(a, b)]
`zip` [HsExpr GhcRn]
cmd_names') LHsCmd GhcRn
cmd',
                  FreeVars
fvCmd FreeVars -> FreeVars -> FreeVars
`plusFV` FreeVars
cmd_fvs) }
  rnCmdTop' (XCmdTop{}) = String -> IOEnv (Env TcGblEnv TcLclEnv) (HsCmdTop GhcRn, FreeVars)
forall a. String -> a
panic "rnCmdTop"

rnLCmd :: LHsCmd GhcPs -> RnM (LHsCmd GhcRn, FreeVars)
rnLCmd :: LHsCmd GhcPs -> RnM (LHsCmd GhcRn, FreeVars)
rnLCmd = (SrcSpanLess (LHsCmd GhcPs)
 -> TcM (SrcSpanLess (LHsCmd GhcRn), FreeVars))
-> LHsCmd GhcPs -> RnM (LHsCmd GhcRn, FreeVars)
forall a b c.
(HasSrcSpan a, HasSrcSpan b) =>
(SrcSpanLess a -> TcM (SrcSpanLess b, c)) -> a -> TcM (b, c)
wrapLocFstM SrcSpanLess (LHsCmd GhcPs)
-> TcM (SrcSpanLess (LHsCmd GhcRn), FreeVars)
HsCmd GhcPs -> RnM (HsCmd GhcRn, FreeVars)
rnCmd

rnCmd :: HsCmd GhcPs -> RnM (HsCmd GhcRn, FreeVars)

rnCmd :: HsCmd GhcPs -> RnM (HsCmd GhcRn, FreeVars)
rnCmd (HsCmdArrApp x :: XCmdArrApp GhcPs
x arrow :: LHsExpr GhcPs
arrow arg :: LHsExpr GhcPs
arg ho :: HsArrAppType
ho rtl :: Bool
rtl)
  = do { (arrow' :: LHsExpr GhcRn
arrow',fvArrow :: FreeVars
fvArrow) <- RnM (LHsExpr GhcRn, FreeVars) -> RnM (LHsExpr GhcRn, FreeVars)
select_arrow_scope (LHsExpr GhcPs -> RnM (LHsExpr GhcRn, FreeVars)
rnLExpr LHsExpr GhcPs
arrow)
       ; (arg' :: LHsExpr GhcRn
arg',fvArg :: FreeVars
fvArg) <- LHsExpr GhcPs -> RnM (LHsExpr GhcRn, FreeVars)
rnLExpr LHsExpr GhcPs
arg
       ; (HsCmd GhcRn, FreeVars) -> RnM (HsCmd GhcRn, FreeVars)
forall (m :: * -> *) a. Monad m => a -> m a
return (XCmdArrApp GhcRn
-> LHsExpr GhcRn
-> LHsExpr GhcRn
-> HsArrAppType
-> Bool
-> HsCmd GhcRn
forall id.
XCmdArrApp id
-> LHsExpr id -> LHsExpr id -> HsArrAppType -> Bool -> HsCmd id
HsCmdArrApp XCmdArrApp GhcPs
XCmdArrApp GhcRn
x LHsExpr GhcRn
arrow' LHsExpr GhcRn
arg' HsArrAppType
ho Bool
rtl,
                 FreeVars
fvArrow FreeVars -> FreeVars -> FreeVars
`plusFV` FreeVars
fvArg) }
  where
    select_arrow_scope :: RnM (LHsExpr GhcRn, FreeVars) -> RnM (LHsExpr GhcRn, FreeVars)
select_arrow_scope tc :: RnM (LHsExpr GhcRn, FreeVars)
tc = case HsArrAppType
ho of
        HsHigherOrderApp -> RnM (LHsExpr GhcRn, FreeVars)
tc
        HsFirstOrderApp  -> RnM (LHsExpr GhcRn, FreeVars) -> RnM (LHsExpr GhcRn, FreeVars)
forall a. TcM a -> TcM a
escapeArrowScope RnM (LHsExpr GhcRn, FreeVars)
tc
        -- See Note [Escaping the arrow scope] in TcRnTypes
        -- Before renaming 'arrow', use the environment of the enclosing
        -- proc for the (-<) case.
        -- Local bindings, inside the enclosing proc, are not in scope
        -- inside 'arrow'.  In the higher-order case (-<<), they are.

-- infix form
rnCmd (HsCmdArrForm _ op :: LHsExpr GhcPs
op _ (Just _) [arg1 :: LHsCmdTop GhcPs
arg1, arg2 :: LHsCmdTop GhcPs
arg2])
  = do { (op' :: LHsExpr GhcRn
op',fv_op :: FreeVars
fv_op) <- RnM (LHsExpr GhcRn, FreeVars) -> RnM (LHsExpr GhcRn, FreeVars)
forall a. TcM a -> TcM a
escapeArrowScope (LHsExpr GhcPs -> RnM (LHsExpr GhcRn, FreeVars)
rnLExpr LHsExpr GhcPs
op)
       ; let L _ (HsVar _ (L _ op_name :: IdP GhcRn
op_name)) = LHsExpr GhcRn
op'
       ; (arg1' :: LHsCmdTop GhcRn
arg1',fv_arg1 :: FreeVars
fv_arg1) <- LHsCmdTop GhcPs -> RnM (LHsCmdTop GhcRn, FreeVars)
rnCmdTop LHsCmdTop GhcPs
arg1
       ; (arg2' :: LHsCmdTop GhcRn
arg2',fv_arg2 :: FreeVars
fv_arg2) <- LHsCmdTop GhcPs -> RnM (LHsCmdTop GhcRn, FreeVars)
rnCmdTop LHsCmdTop GhcPs
arg2
        -- Deal with fixity
       ; Fixity
fixity <- Name -> RnM Fixity
lookupFixityRn Name
IdP GhcRn
op_name
       ; HsCmd GhcRn
final_e <- LHsCmdTop GhcRn
-> LHsExpr GhcRn -> Fixity -> LHsCmdTop GhcRn -> RnM (HsCmd GhcRn)
mkOpFormRn LHsCmdTop GhcRn
arg1' LHsExpr GhcRn
op' Fixity
fixity LHsCmdTop GhcRn
arg2'
       ; (HsCmd GhcRn, FreeVars) -> RnM (HsCmd GhcRn, FreeVars)
forall (m :: * -> *) a. Monad m => a -> m a
return (HsCmd GhcRn
final_e, FreeVars
fv_arg1 FreeVars -> FreeVars -> FreeVars
`plusFV` FreeVars
fv_op FreeVars -> FreeVars -> FreeVars
`plusFV` FreeVars
fv_arg2) }

rnCmd (HsCmdArrForm x :: XCmdArrForm GhcPs
x op :: LHsExpr GhcPs
op f :: LexicalFixity
f fixity :: Maybe Fixity
fixity cmds :: [LHsCmdTop GhcPs]
cmds)
  = do { (op' :: LHsExpr GhcRn
op',fvOp :: FreeVars
fvOp) <- RnM (LHsExpr GhcRn, FreeVars) -> RnM (LHsExpr GhcRn, FreeVars)
forall a. TcM a -> TcM a
escapeArrowScope (LHsExpr GhcPs -> RnM (LHsExpr GhcRn, FreeVars)
rnLExpr LHsExpr GhcPs
op)
       ; (cmds' :: [LHsCmdTop GhcRn]
cmds',fvCmds :: FreeVars
fvCmds) <- [LHsCmdTop GhcPs] -> RnM ([LHsCmdTop GhcRn], FreeVars)
rnCmdArgs [LHsCmdTop GhcPs]
cmds
       ; (HsCmd GhcRn, FreeVars) -> RnM (HsCmd GhcRn, FreeVars)
forall (m :: * -> *) a. Monad m => a -> m a
return (XCmdArrForm GhcRn
-> LHsExpr GhcRn
-> LexicalFixity
-> Maybe Fixity
-> [LHsCmdTop GhcRn]
-> HsCmd GhcRn
forall id.
XCmdArrForm id
-> LHsExpr id
-> LexicalFixity
-> Maybe Fixity
-> [LHsCmdTop id]
-> HsCmd id
HsCmdArrForm XCmdArrForm GhcPs
XCmdArrForm GhcRn
x LHsExpr GhcRn
op' LexicalFixity
f Maybe Fixity
fixity [LHsCmdTop GhcRn]
cmds', FreeVars
fvOp FreeVars -> FreeVars -> FreeVars
`plusFV` FreeVars
fvCmds) }

rnCmd (HsCmdApp x :: XCmdApp GhcPs
x fun :: LHsCmd GhcPs
fun arg :: LHsExpr GhcPs
arg)
  = do { (fun' :: LHsCmd GhcRn
fun',fvFun :: FreeVars
fvFun) <- LHsCmd GhcPs -> RnM (LHsCmd GhcRn, FreeVars)
rnLCmd  LHsCmd GhcPs
fun
       ; (arg' :: LHsExpr GhcRn
arg',fvArg :: FreeVars
fvArg) <- LHsExpr GhcPs -> RnM (LHsExpr GhcRn, FreeVars)
rnLExpr LHsExpr GhcPs
arg
       ; (HsCmd GhcRn, FreeVars) -> RnM (HsCmd GhcRn, FreeVars)
forall (m :: * -> *) a. Monad m => a -> m a
return (XCmdApp GhcRn -> LHsCmd GhcRn -> LHsExpr GhcRn -> HsCmd GhcRn
forall id. XCmdApp id -> LHsCmd id -> LHsExpr id -> HsCmd id
HsCmdApp XCmdApp GhcPs
XCmdApp GhcRn
x LHsCmd GhcRn
fun' LHsExpr GhcRn
arg', FreeVars
fvFun FreeVars -> FreeVars -> FreeVars
`plusFV` FreeVars
fvArg) }

rnCmd (HsCmdLam x :: XCmdLam GhcPs
x matches :: MatchGroup GhcPs (LHsCmd GhcPs)
matches)
  = do { (matches' :: MatchGroup GhcRn (LHsCmd GhcRn)
matches', fvMatch :: FreeVars
fvMatch) <- HsMatchContext Name
-> (LHsCmd GhcPs -> RnM (LHsCmd GhcRn, FreeVars))
-> MatchGroup GhcPs (LHsCmd GhcPs)
-> RnM (MatchGroup GhcRn (LHsCmd GhcRn), FreeVars)
forall (body :: * -> *).
Outputable (body GhcPs) =>
HsMatchContext Name
-> (Located (body GhcPs) -> RnM (Located (body GhcRn), FreeVars))
-> MatchGroup GhcPs (Located (body GhcPs))
-> RnM (MatchGroup GhcRn (Located (body GhcRn)), FreeVars)
rnMatchGroup HsMatchContext Name
forall id. HsMatchContext id
LambdaExpr LHsCmd GhcPs -> RnM (LHsCmd GhcRn, FreeVars)
rnLCmd MatchGroup GhcPs (LHsCmd GhcPs)
matches
       ; (HsCmd GhcRn, FreeVars) -> RnM (HsCmd GhcRn, FreeVars)
forall (m :: * -> *) a. Monad m => a -> m a
return (XCmdLam GhcRn -> MatchGroup GhcRn (LHsCmd GhcRn) -> HsCmd GhcRn
forall id. XCmdLam id -> MatchGroup id (LHsCmd id) -> HsCmd id
HsCmdLam XCmdLam GhcPs
XCmdLam GhcRn
x MatchGroup GhcRn (LHsCmd GhcRn)
matches', FreeVars
fvMatch) }

rnCmd (HsCmdPar x :: XCmdPar GhcPs
x e :: LHsCmd GhcPs
e)
  = do  { (e' :: LHsCmd GhcRn
e', fvs_e :: FreeVars
fvs_e) <- LHsCmd GhcPs -> RnM (LHsCmd GhcRn, FreeVars)
rnLCmd LHsCmd GhcPs
e
        ; (HsCmd GhcRn, FreeVars) -> RnM (HsCmd GhcRn, FreeVars)
forall (m :: * -> *) a. Monad m => a -> m a
return (XCmdPar GhcRn -> LHsCmd GhcRn -> HsCmd GhcRn
forall id. XCmdPar id -> LHsCmd id -> HsCmd id
HsCmdPar XCmdPar GhcPs
XCmdPar GhcRn
x LHsCmd GhcRn
e', FreeVars
fvs_e) }

rnCmd (HsCmdCase x :: XCmdCase GhcPs
x expr :: LHsExpr GhcPs
expr matches :: MatchGroup GhcPs (LHsCmd GhcPs)
matches)
  = do { (new_expr :: LHsExpr GhcRn
new_expr, e_fvs :: FreeVars
e_fvs) <- LHsExpr GhcPs -> RnM (LHsExpr GhcRn, FreeVars)
rnLExpr LHsExpr GhcPs
expr
       ; (new_matches :: MatchGroup GhcRn (LHsCmd GhcRn)
new_matches, ms_fvs :: FreeVars
ms_fvs) <- HsMatchContext Name
-> (LHsCmd GhcPs -> RnM (LHsCmd GhcRn, FreeVars))
-> MatchGroup GhcPs (LHsCmd GhcPs)
-> RnM (MatchGroup GhcRn (LHsCmd GhcRn), FreeVars)
forall (body :: * -> *).
Outputable (body GhcPs) =>
HsMatchContext Name
-> (Located (body GhcPs) -> RnM (Located (body GhcRn), FreeVars))
-> MatchGroup GhcPs (Located (body GhcPs))
-> RnM (MatchGroup GhcRn (Located (body GhcRn)), FreeVars)
rnMatchGroup HsMatchContext Name
forall id. HsMatchContext id
CaseAlt LHsCmd GhcPs -> RnM (LHsCmd GhcRn, FreeVars)
rnLCmd MatchGroup GhcPs (LHsCmd GhcPs)
matches
       ; (HsCmd GhcRn, FreeVars) -> RnM (HsCmd GhcRn, FreeVars)
forall (m :: * -> *) a. Monad m => a -> m a
return (XCmdCase GhcRn
-> LHsExpr GhcRn -> MatchGroup GhcRn (LHsCmd GhcRn) -> HsCmd GhcRn
forall id.
XCmdCase id -> LHsExpr id -> MatchGroup id (LHsCmd id) -> HsCmd id
HsCmdCase XCmdCase GhcPs
XCmdCase GhcRn
x LHsExpr GhcRn
new_expr MatchGroup GhcRn (LHsCmd GhcRn)
new_matches, FreeVars
e_fvs FreeVars -> FreeVars -> FreeVars
`plusFV` FreeVars
ms_fvs) }

rnCmd (HsCmdIf x :: XCmdIf GhcPs
x _ p :: LHsExpr GhcPs
p b1 :: LHsCmd GhcPs
b1 b2 :: LHsCmd GhcPs
b2)
  = do { (p' :: LHsExpr GhcRn
p', fvP :: FreeVars
fvP) <- LHsExpr GhcPs -> RnM (LHsExpr GhcRn, FreeVars)
rnLExpr LHsExpr GhcPs
p
       ; (b1' :: LHsCmd GhcRn
b1', fvB1 :: FreeVars
fvB1) <- LHsCmd GhcPs -> RnM (LHsCmd GhcRn, FreeVars)
rnLCmd LHsCmd GhcPs
b1
       ; (b2' :: LHsCmd GhcRn
b2', fvB2 :: FreeVars
fvB2) <- LHsCmd GhcPs -> RnM (LHsCmd GhcRn, FreeVars)
rnLCmd LHsCmd GhcPs
b2
       ; (mb_ite :: Maybe (SyntaxExpr GhcRn)
mb_ite, fvITE :: FreeVars
fvITE) <- RnM (Maybe (SyntaxExpr GhcRn), FreeVars)
lookupIfThenElse
       ; (HsCmd GhcRn, FreeVars) -> RnM (HsCmd GhcRn, FreeVars)
forall (m :: * -> *) a. Monad m => a -> m a
return (XCmdIf GhcRn
-> Maybe (SyntaxExpr GhcRn)
-> LHsExpr GhcRn
-> LHsCmd GhcRn
-> LHsCmd GhcRn
-> HsCmd GhcRn
forall id.
XCmdIf id
-> Maybe (SyntaxExpr id)
-> LHsExpr id
-> LHsCmd id
-> LHsCmd id
-> HsCmd id
HsCmdIf XCmdIf GhcPs
XCmdIf GhcRn
x Maybe (SyntaxExpr GhcRn)
mb_ite LHsExpr GhcRn
p' LHsCmd GhcRn
b1' LHsCmd GhcRn
b2', [FreeVars] -> FreeVars
plusFVs [FreeVars
fvITE, FreeVars
fvP, FreeVars
fvB1, FreeVars
fvB2])}

rnCmd (HsCmdLet x :: XCmdLet GhcPs
x (L l :: SrcSpan
l binds :: HsLocalBinds GhcPs
binds) cmd :: LHsCmd GhcPs
cmd)
  = HsLocalBinds GhcPs
-> (HsLocalBinds GhcRn -> FreeVars -> RnM (HsCmd GhcRn, FreeVars))
-> RnM (HsCmd GhcRn, FreeVars)
forall result.
HsLocalBinds GhcPs
-> (HsLocalBinds GhcRn -> FreeVars -> RnM (result, FreeVars))
-> RnM (result, FreeVars)
rnLocalBindsAndThen HsLocalBinds GhcPs
binds ((HsLocalBinds GhcRn -> FreeVars -> RnM (HsCmd GhcRn, FreeVars))
 -> RnM (HsCmd GhcRn, FreeVars))
-> (HsLocalBinds GhcRn -> FreeVars -> RnM (HsCmd GhcRn, FreeVars))
-> RnM (HsCmd GhcRn, FreeVars)
forall a b. (a -> b) -> a -> b
$ \ binds' :: HsLocalBinds GhcRn
binds' _ -> do
      { (cmd' :: LHsCmd GhcRn
cmd',fvExpr :: FreeVars
fvExpr) <- LHsCmd GhcPs -> RnM (LHsCmd GhcRn, FreeVars)
rnLCmd LHsCmd GhcPs
cmd
      ; (HsCmd GhcRn, FreeVars) -> RnM (HsCmd GhcRn, FreeVars)
forall (m :: * -> *) a. Monad m => a -> m a
return (XCmdLet GhcRn -> LHsLocalBinds GhcRn -> LHsCmd GhcRn -> HsCmd GhcRn
forall id. XCmdLet id -> LHsLocalBinds id -> LHsCmd id -> HsCmd id
HsCmdLet XCmdLet GhcPs
XCmdLet GhcRn
x (SrcSpan -> HsLocalBinds GhcRn -> LHsLocalBinds GhcRn
forall l e. l -> e -> GenLocated l e
L SrcSpan
l HsLocalBinds GhcRn
binds') LHsCmd GhcRn
cmd', FreeVars
fvExpr) }

rnCmd (HsCmdDo x :: XCmdDo GhcPs
x (L l :: SrcSpan
l stmts :: [CmdLStmt GhcPs]
stmts))
  = do  { ((stmts' :: [LStmt GhcRn (LHsCmd GhcRn)]
stmts', _), fvs :: FreeVars
fvs) <-
            HsStmtContext Name
-> (LHsCmd GhcPs -> RnM (LHsCmd GhcRn, FreeVars))
-> [CmdLStmt GhcPs]
-> ([Name] -> RnM ((), FreeVars))
-> RnM (([LStmt GhcRn (LHsCmd GhcRn)], ()), FreeVars)
forall (body :: * -> *) thing.
Outputable (body GhcPs) =>
HsStmtContext Name
-> (Located (body GhcPs) -> RnM (Located (body GhcRn), FreeVars))
-> [LStmt GhcPs (Located (body GhcPs))]
-> ([Name] -> RnM (thing, FreeVars))
-> RnM (([LStmt GhcRn (Located (body GhcRn))], thing), FreeVars)
rnStmts HsStmtContext Name
forall id. HsStmtContext id
ArrowExpr LHsCmd GhcPs -> RnM (LHsCmd GhcRn, FreeVars)
rnLCmd [CmdLStmt GhcPs]
stmts (\ _ -> ((), FreeVars) -> RnM ((), FreeVars)
forall (m :: * -> *) a. Monad m => a -> m a
return ((), FreeVars
emptyFVs))
        ; (HsCmd GhcRn, FreeVars) -> RnM (HsCmd GhcRn, FreeVars)
forall (m :: * -> *) a. Monad m => a -> m a
return ( XCmdDo GhcRn -> Located [LStmt GhcRn (LHsCmd GhcRn)] -> HsCmd GhcRn
forall id. XCmdDo id -> Located [CmdLStmt id] -> HsCmd id
HsCmdDo XCmdDo GhcPs
XCmdDo GhcRn
x (SrcSpan
-> [LStmt GhcRn (LHsCmd GhcRn)]
-> Located [LStmt GhcRn (LHsCmd GhcRn)]
forall l e. l -> e -> GenLocated l e
L SrcSpan
l [LStmt GhcRn (LHsCmd GhcRn)]
stmts'), FreeVars
fvs ) }

rnCmd cmd :: HsCmd GhcPs
cmd@(HsCmdWrap {}) = String -> MsgDoc -> RnM (HsCmd GhcRn, FreeVars)
forall a. HasCallStack => String -> MsgDoc -> a
pprPanic "rnCmd" (HsCmd GhcPs -> MsgDoc
forall a. Outputable a => a -> MsgDoc
ppr HsCmd GhcPs
cmd)
rnCmd cmd :: HsCmd GhcPs
cmd@(XCmd {})      = String -> MsgDoc -> RnM (HsCmd GhcRn, FreeVars)
forall a. HasCallStack => String -> MsgDoc -> a
pprPanic "rnCmd" (HsCmd GhcPs -> MsgDoc
forall a. Outputable a => a -> MsgDoc
ppr HsCmd GhcPs
cmd)

---------------------------------------------------
type CmdNeeds = FreeVars        -- Only inhabitants are
                                --      appAName, choiceAName, loopAName

-- find what methods the Cmd needs (loop, choice, apply)
methodNamesLCmd :: LHsCmd GhcRn -> CmdNeeds
methodNamesLCmd :: LHsCmd GhcRn -> FreeVars
methodNamesLCmd = HsCmd GhcRn -> FreeVars
methodNamesCmd (HsCmd GhcRn -> FreeVars)
-> (LHsCmd GhcRn -> HsCmd GhcRn) -> LHsCmd GhcRn -> FreeVars
forall b c a. (b -> c) -> (a -> b) -> a -> c
. LHsCmd GhcRn -> HsCmd GhcRn
forall a. HasSrcSpan a => a -> SrcSpanLess a
unLoc

methodNamesCmd :: HsCmd GhcRn -> CmdNeeds

methodNamesCmd :: HsCmd GhcRn -> FreeVars
methodNamesCmd (HsCmdArrApp _ _arrow :: LHsExpr GhcRn
_arrow _arg :: LHsExpr GhcRn
_arg HsFirstOrderApp _rtl :: Bool
_rtl)
  = FreeVars
emptyFVs
methodNamesCmd (HsCmdArrApp _ _arrow :: LHsExpr GhcRn
_arrow _arg :: LHsExpr GhcRn
_arg HsHigherOrderApp _rtl :: Bool
_rtl)
  = Name -> FreeVars
unitFV Name
appAName
methodNamesCmd (HsCmdArrForm {}) = FreeVars
emptyFVs
methodNamesCmd (HsCmdWrap _ _ cmd :: HsCmd GhcRn
cmd) = HsCmd GhcRn -> FreeVars
methodNamesCmd HsCmd GhcRn
cmd

methodNamesCmd (HsCmdPar _ c :: LHsCmd GhcRn
c) = LHsCmd GhcRn -> FreeVars
methodNamesLCmd LHsCmd GhcRn
c

methodNamesCmd (HsCmdIf _ _ _ c1 :: LHsCmd GhcRn
c1 c2 :: LHsCmd GhcRn
c2)
  = LHsCmd GhcRn -> FreeVars
methodNamesLCmd LHsCmd GhcRn
c1 FreeVars -> FreeVars -> FreeVars
`plusFV` LHsCmd GhcRn -> FreeVars
methodNamesLCmd LHsCmd GhcRn
c2 FreeVars -> Name -> FreeVars
`addOneFV` Name
choiceAName

methodNamesCmd (HsCmdLet _ _ c :: LHsCmd GhcRn
c)          = LHsCmd GhcRn -> FreeVars
methodNamesLCmd LHsCmd GhcRn
c
methodNamesCmd (HsCmdDo _ (L _ stmts :: [LStmt GhcRn (LHsCmd GhcRn)]
stmts))   = [LStmt GhcRn (LHsCmd GhcRn)] -> FreeVars
methodNamesStmts [LStmt GhcRn (LHsCmd GhcRn)]
stmts
methodNamesCmd (HsCmdApp _ c :: LHsCmd GhcRn
c _)          = LHsCmd GhcRn -> FreeVars
methodNamesLCmd LHsCmd GhcRn
c
methodNamesCmd (HsCmdLam _ match :: MatchGroup GhcRn (LHsCmd GhcRn)
match)        = MatchGroup GhcRn (LHsCmd GhcRn) -> FreeVars
methodNamesMatch MatchGroup GhcRn (LHsCmd GhcRn)
match

methodNamesCmd (HsCmdCase _ _ matches :: MatchGroup GhcRn (LHsCmd GhcRn)
matches)
  = MatchGroup GhcRn (LHsCmd GhcRn) -> FreeVars
methodNamesMatch MatchGroup GhcRn (LHsCmd GhcRn)
matches FreeVars -> Name -> FreeVars
`addOneFV` Name
choiceAName

methodNamesCmd (XCmd {}) = String -> FreeVars
forall a. String -> a
panic "methodNamesCmd"

--methodNamesCmd _ = emptyFVs
   -- Other forms can't occur in commands, but it's not convenient
   -- to error here so we just do what's convenient.
   -- The type checker will complain later

---------------------------------------------------
methodNamesMatch :: MatchGroup GhcRn (LHsCmd GhcRn) -> FreeVars
methodNamesMatch :: MatchGroup GhcRn (LHsCmd GhcRn) -> FreeVars
methodNamesMatch (MG { mg_alts :: forall p body. MatchGroup p body -> Located [LMatch p body]
mg_alts = L _ ms :: [LMatch GhcRn (LHsCmd GhcRn)]
ms })
  = [FreeVars] -> FreeVars
plusFVs ((LMatch GhcRn (LHsCmd GhcRn) -> FreeVars)
-> [LMatch GhcRn (LHsCmd GhcRn)] -> [FreeVars]
forall a b. (a -> b) -> [a] -> [b]
map LMatch GhcRn (LHsCmd GhcRn) -> FreeVars
forall l. GenLocated l (Match GhcRn (LHsCmd GhcRn)) -> FreeVars
do_one [LMatch GhcRn (LHsCmd GhcRn)]
ms)
 where
    do_one :: GenLocated l (Match GhcRn (LHsCmd GhcRn)) -> FreeVars
do_one (L _ (Match { m_grhss :: forall p body. Match p body -> GRHSs p body
m_grhss = GRHSs GhcRn (LHsCmd GhcRn)
grhss })) = GRHSs GhcRn (LHsCmd GhcRn) -> FreeVars
methodNamesGRHSs GRHSs GhcRn (LHsCmd GhcRn)
grhss
    do_one (L _ (XMatch _)) = String -> FreeVars
forall a. String -> a
panic "methodNamesMatch.XMatch"
methodNamesMatch (XMatchGroup _) = String -> FreeVars
forall a. String -> a
panic "methodNamesMatch"

-------------------------------------------------
-- gaw 2004
methodNamesGRHSs :: GRHSs GhcRn (LHsCmd GhcRn) -> FreeVars
methodNamesGRHSs :: GRHSs GhcRn (LHsCmd GhcRn) -> FreeVars
methodNamesGRHSs (GRHSs _ grhss :: [LGRHS GhcRn (LHsCmd GhcRn)]
grhss _) = [FreeVars] -> FreeVars
plusFVs ((LGRHS GhcRn (LHsCmd GhcRn) -> FreeVars)
-> [LGRHS GhcRn (LHsCmd GhcRn)] -> [FreeVars]
forall a b. (a -> b) -> [a] -> [b]
map LGRHS GhcRn (LHsCmd GhcRn) -> FreeVars
methodNamesGRHS [LGRHS GhcRn (LHsCmd GhcRn)]
grhss)
methodNamesGRHSs (XGRHSs _) = String -> FreeVars
forall a. String -> a
panic "methodNamesGRHSs"

-------------------------------------------------

methodNamesGRHS :: Located (GRHS GhcRn (LHsCmd GhcRn)) -> CmdNeeds
methodNamesGRHS :: LGRHS GhcRn (LHsCmd GhcRn) -> FreeVars
methodNamesGRHS (L _ (GRHS _ _ rhs :: LHsCmd GhcRn
rhs)) = LHsCmd GhcRn -> FreeVars
methodNamesLCmd LHsCmd GhcRn
rhs
methodNamesGRHS (L _ (XGRHS _)) = String -> FreeVars
forall a. String -> a
panic "methodNamesGRHS"

---------------------------------------------------
methodNamesStmts :: [Located (StmtLR GhcRn GhcRn (LHsCmd GhcRn))] -> FreeVars
methodNamesStmts :: [LStmt GhcRn (LHsCmd GhcRn)] -> FreeVars
methodNamesStmts stmts :: [LStmt GhcRn (LHsCmd GhcRn)]
stmts = [FreeVars] -> FreeVars
plusFVs ((LStmt GhcRn (LHsCmd GhcRn) -> FreeVars)
-> [LStmt GhcRn (LHsCmd GhcRn)] -> [FreeVars]
forall a b. (a -> b) -> [a] -> [b]
map LStmt GhcRn (LHsCmd GhcRn) -> FreeVars
methodNamesLStmt [LStmt GhcRn (LHsCmd GhcRn)]
stmts)

---------------------------------------------------
methodNamesLStmt :: Located (StmtLR GhcRn GhcRn (LHsCmd GhcRn)) -> FreeVars
methodNamesLStmt :: LStmt GhcRn (LHsCmd GhcRn) -> FreeVars
methodNamesLStmt = StmtLR GhcRn GhcRn (LHsCmd GhcRn) -> FreeVars
methodNamesStmt (StmtLR GhcRn GhcRn (LHsCmd GhcRn) -> FreeVars)
-> (LStmt GhcRn (LHsCmd GhcRn)
    -> StmtLR GhcRn GhcRn (LHsCmd GhcRn))
-> LStmt GhcRn (LHsCmd GhcRn)
-> FreeVars
forall b c a. (b -> c) -> (a -> b) -> a -> c
. LStmt GhcRn (LHsCmd GhcRn) -> StmtLR GhcRn GhcRn (LHsCmd GhcRn)
forall a. HasSrcSpan a => a -> SrcSpanLess a
unLoc

methodNamesStmt :: StmtLR GhcRn GhcRn (LHsCmd GhcRn) -> FreeVars
methodNamesStmt :: StmtLR GhcRn GhcRn (LHsCmd GhcRn) -> FreeVars
methodNamesStmt (LastStmt _ cmd :: LHsCmd GhcRn
cmd _ _)           = LHsCmd GhcRn -> FreeVars
methodNamesLCmd LHsCmd GhcRn
cmd
methodNamesStmt (BodyStmt _ cmd :: LHsCmd GhcRn
cmd _ _)           = LHsCmd GhcRn -> FreeVars
methodNamesLCmd LHsCmd GhcRn
cmd
methodNamesStmt (BindStmt _ _ cmd :: LHsCmd GhcRn
cmd _ _)         = LHsCmd GhcRn -> FreeVars
methodNamesLCmd LHsCmd GhcRn
cmd
methodNamesStmt (RecStmt { recS_stmts :: forall idL idR body. StmtLR idL idR body -> [LStmtLR idL idR body]
recS_stmts = [LStmt GhcRn (LHsCmd GhcRn)]
stmts }) =
  [LStmt GhcRn (LHsCmd GhcRn)] -> FreeVars
methodNamesStmts [LStmt GhcRn (LHsCmd GhcRn)]
stmts FreeVars -> Name -> FreeVars
`addOneFV` Name
loopAName
methodNamesStmt (LetStmt {})                   = FreeVars
emptyFVs
methodNamesStmt (ParStmt {})                   = FreeVars
emptyFVs
methodNamesStmt (TransStmt {})                 = FreeVars
emptyFVs
methodNamesStmt ApplicativeStmt{}              = FreeVars
emptyFVs
   -- ParStmt and TransStmt can't occur in commands, but it's not
   -- convenient to error here so we just do what's convenient
methodNamesStmt (XStmtLR {}) = String -> FreeVars
forall a. String -> a
panic "methodNamesStmt"

{-
************************************************************************
*                                                                      *
        Arithmetic sequences
*                                                                      *
************************************************************************
-}

rnArithSeq :: ArithSeqInfo GhcPs -> RnM (ArithSeqInfo GhcRn, FreeVars)
rnArithSeq :: ArithSeqInfo GhcPs -> RnM (ArithSeqInfo GhcRn, FreeVars)
rnArithSeq (From expr :: LHsExpr GhcPs
expr)
 = do { (expr' :: LHsExpr GhcRn
expr', fvExpr :: FreeVars
fvExpr) <- LHsExpr GhcPs -> RnM (LHsExpr GhcRn, FreeVars)
rnLExpr LHsExpr GhcPs
expr
      ; (ArithSeqInfo GhcRn, FreeVars)
-> RnM (ArithSeqInfo GhcRn, FreeVars)
forall (m :: * -> *) a. Monad m => a -> m a
return (LHsExpr GhcRn -> ArithSeqInfo GhcRn
forall id. LHsExpr id -> ArithSeqInfo id
From LHsExpr GhcRn
expr', FreeVars
fvExpr) }

rnArithSeq (FromThen expr1 :: LHsExpr GhcPs
expr1 expr2 :: LHsExpr GhcPs
expr2)
 = do { (expr1' :: LHsExpr GhcRn
expr1', fvExpr1 :: FreeVars
fvExpr1) <- LHsExpr GhcPs -> RnM (LHsExpr GhcRn, FreeVars)
rnLExpr LHsExpr GhcPs
expr1
      ; (expr2' :: LHsExpr GhcRn
expr2', fvExpr2 :: FreeVars
fvExpr2) <- LHsExpr GhcPs -> RnM (LHsExpr GhcRn, FreeVars)
rnLExpr LHsExpr GhcPs
expr2
      ; (ArithSeqInfo GhcRn, FreeVars)
-> RnM (ArithSeqInfo GhcRn, FreeVars)
forall (m :: * -> *) a. Monad m => a -> m a
return (LHsExpr GhcRn -> LHsExpr GhcRn -> ArithSeqInfo GhcRn
forall id. LHsExpr id -> LHsExpr id -> ArithSeqInfo id
FromThen LHsExpr GhcRn
expr1' LHsExpr GhcRn
expr2', FreeVars
fvExpr1 FreeVars -> FreeVars -> FreeVars
`plusFV` FreeVars
fvExpr2) }

rnArithSeq (FromTo expr1 :: LHsExpr GhcPs
expr1 expr2 :: LHsExpr GhcPs
expr2)
 = do { (expr1' :: LHsExpr GhcRn
expr1', fvExpr1 :: FreeVars
fvExpr1) <- LHsExpr GhcPs -> RnM (LHsExpr GhcRn, FreeVars)
rnLExpr LHsExpr GhcPs
expr1
      ; (expr2' :: LHsExpr GhcRn
expr2', fvExpr2 :: FreeVars
fvExpr2) <- LHsExpr GhcPs -> RnM (LHsExpr GhcRn, FreeVars)
rnLExpr LHsExpr GhcPs
expr2
      ; (ArithSeqInfo GhcRn, FreeVars)
-> RnM (ArithSeqInfo GhcRn, FreeVars)
forall (m :: * -> *) a. Monad m => a -> m a
return (LHsExpr GhcRn -> LHsExpr GhcRn -> ArithSeqInfo GhcRn
forall id. LHsExpr id -> LHsExpr id -> ArithSeqInfo id
FromTo LHsExpr GhcRn
expr1' LHsExpr GhcRn
expr2', FreeVars
fvExpr1 FreeVars -> FreeVars -> FreeVars
`plusFV` FreeVars
fvExpr2) }

rnArithSeq (FromThenTo expr1 :: LHsExpr GhcPs
expr1 expr2 :: LHsExpr GhcPs
expr2 expr3 :: LHsExpr GhcPs
expr3)
 = do { (expr1' :: LHsExpr GhcRn
expr1', fvExpr1 :: FreeVars
fvExpr1) <- LHsExpr GhcPs -> RnM (LHsExpr GhcRn, FreeVars)
rnLExpr LHsExpr GhcPs
expr1
      ; (expr2' :: LHsExpr GhcRn
expr2', fvExpr2 :: FreeVars
fvExpr2) <- LHsExpr GhcPs -> RnM (LHsExpr GhcRn, FreeVars)
rnLExpr LHsExpr GhcPs
expr2
      ; (expr3' :: LHsExpr GhcRn
expr3', fvExpr3 :: FreeVars
fvExpr3) <- LHsExpr GhcPs -> RnM (LHsExpr GhcRn, FreeVars)
rnLExpr LHsExpr GhcPs
expr3
      ; (ArithSeqInfo GhcRn, FreeVars)
-> RnM (ArithSeqInfo GhcRn, FreeVars)
forall (m :: * -> *) a. Monad m => a -> m a
return (LHsExpr GhcRn
-> LHsExpr GhcRn -> LHsExpr GhcRn -> ArithSeqInfo GhcRn
forall id.
LHsExpr id -> LHsExpr id -> LHsExpr id -> ArithSeqInfo id
FromThenTo LHsExpr GhcRn
expr1' LHsExpr GhcRn
expr2' LHsExpr GhcRn
expr3',
                [FreeVars] -> FreeVars
plusFVs [FreeVars
fvExpr1, FreeVars
fvExpr2, FreeVars
fvExpr3]) }

{-
************************************************************************
*                                                                      *
\subsubsection{@Stmt@s: in @do@ expressions}
*                                                                      *
************************************************************************
-}

{-
Note [Deterministic ApplicativeDo and RecursiveDo desugaring]
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Both ApplicativeDo and RecursiveDo need to create tuples not
present in the source text.

For ApplicativeDo we create:

  (a,b,c) <- (\c b a -> (a,b,c)) <$>

For RecursiveDo we create:

  mfix (\ ~(a,b,c) -> do ...; return (a',b',c'))

The order of the components in those tuples needs to be stable
across recompilations, otherwise they can get optimized differently
and we end up with incompatible binaries.
To get a stable order we use nameSetElemsStable.
See Note [Deterministic UniqFM] to learn more about nondeterminism.
-}

-- | Rename some Stmts
rnStmts :: Outputable (body GhcPs)
        => HsStmtContext Name
        -> (Located (body GhcPs) -> RnM (Located (body GhcRn), FreeVars))
           -- ^ How to rename the body of each statement (e.g. rnLExpr)
        -> [LStmt GhcPs (Located (body GhcPs))]
           -- ^ Statements
        -> ([Name] -> RnM (thing, FreeVars))
           -- ^ if these statements scope over something, this renames it
           -- and returns the result.
        -> RnM (([LStmt GhcRn (Located (body GhcRn))], thing), FreeVars)
rnStmts :: HsStmtContext Name
-> (Located (body GhcPs) -> RnM (Located (body GhcRn), FreeVars))
-> [LStmt GhcPs (Located (body GhcPs))]
-> ([Name] -> RnM (thing, FreeVars))
-> RnM (([LStmt GhcRn (Located (body GhcRn))], thing), FreeVars)
rnStmts ctxt :: HsStmtContext Name
ctxt rnBody :: Located (body GhcPs) -> RnM (Located (body GhcRn), FreeVars)
rnBody = HsStmtContext Name
-> (Located (body GhcPs) -> RnM (Located (body GhcRn), FreeVars))
-> (HsStmtContext Name
    -> [(LStmt GhcRn (Located (body GhcRn)), FreeVars)]
    -> RnM ([LStmt GhcRn (Located (body GhcRn))], FreeVars))
-> [LStmt GhcPs (Located (body GhcPs))]
-> ([Name] -> RnM (thing, FreeVars))
-> RnM (([LStmt GhcRn (Located (body GhcRn))], thing), FreeVars)
forall (body :: * -> *) thing.
Outputable (body GhcPs) =>
HsStmtContext Name
-> (Located (body GhcPs) -> RnM (Located (body GhcRn), FreeVars))
-> (HsStmtContext Name
    -> [(LStmt GhcRn (Located (body GhcRn)), FreeVars)]
    -> RnM ([LStmt GhcRn (Located (body GhcRn))], FreeVars))
-> [LStmt GhcPs (Located (body GhcPs))]
-> ([Name] -> RnM (thing, FreeVars))
-> RnM (([LStmt GhcRn (Located (body GhcRn))], thing), FreeVars)
rnStmtsWithPostProcessing HsStmtContext Name
ctxt Located (body GhcPs) -> RnM (Located (body GhcRn), FreeVars)
rnBody HsStmtContext Name
-> [(LStmt GhcRn (Located (body GhcRn)), FreeVars)]
-> RnM ([LStmt GhcRn (Located (body GhcRn))], FreeVars)
forall (body :: * -> *).
HsStmtContext Name
-> [(LStmt GhcRn (Located (body GhcRn)), FreeVars)]
-> RnM ([LStmt GhcRn (Located (body GhcRn))], FreeVars)
noPostProcessStmts

-- | like 'rnStmts' but applies a post-processing step to the renamed Stmts
rnStmtsWithPostProcessing
        :: Outputable (body GhcPs)
        => HsStmtContext Name
        -> (Located (body GhcPs) -> RnM (Located (body GhcRn), FreeVars))
           -- ^ How to rename the body of each statement (e.g. rnLExpr)
        -> (HsStmtContext Name
              -> [(LStmt GhcRn (Located (body GhcRn)), FreeVars)]
              -> RnM ([LStmt GhcRn (Located (body GhcRn))], FreeVars))
           -- ^ postprocess the statements
        -> [LStmt GhcPs (Located (body GhcPs))]
           -- ^ Statements
        -> ([Name] -> RnM (thing, FreeVars))
           -- ^ if these statements scope over something, this renames it
           -- and returns the result.
        -> RnM (([LStmt GhcRn (Located (body GhcRn))], thing), FreeVars)
rnStmtsWithPostProcessing :: HsStmtContext Name
-> (Located (body GhcPs) -> RnM (Located (body GhcRn), FreeVars))
-> (HsStmtContext Name
    -> [(LStmt GhcRn (Located (body GhcRn)), FreeVars)]
    -> RnM ([LStmt GhcRn (Located (body GhcRn))], FreeVars))
-> [LStmt GhcPs (Located (body GhcPs))]
-> ([Name] -> RnM (thing, FreeVars))
-> RnM (([LStmt GhcRn (Located (body GhcRn))], thing), FreeVars)
rnStmtsWithPostProcessing ctxt :: HsStmtContext Name
ctxt rnBody :: Located (body GhcPs) -> RnM (Located (body GhcRn), FreeVars)
rnBody ppStmts :: HsStmtContext Name
-> [(LStmt GhcRn (Located (body GhcRn)), FreeVars)]
-> RnM ([LStmt GhcRn (Located (body GhcRn))], FreeVars)
ppStmts stmts :: [LStmt GhcPs (Located (body GhcPs))]
stmts thing_inside :: [Name] -> RnM (thing, FreeVars)
thing_inside
 = do { ((stmts' :: [(LStmt GhcRn (Located (body GhcRn)), FreeVars)]
stmts', thing :: thing
thing), fvs :: FreeVars
fvs) <-
          HsStmtContext Name
-> (Located (body GhcPs) -> RnM (Located (body GhcRn), FreeVars))
-> [LStmt GhcPs (Located (body GhcPs))]
-> ([Name] -> RnM (thing, FreeVars))
-> RnM
     (([(LStmt GhcRn (Located (body GhcRn)), FreeVars)], thing),
      FreeVars)
forall (body :: * -> *) thing.
Outputable (body GhcPs) =>
HsStmtContext Name
-> (Located (body GhcPs) -> RnM (Located (body GhcRn), FreeVars))
-> [LStmt GhcPs (Located (body GhcPs))]
-> ([Name] -> RnM (thing, FreeVars))
-> RnM
     (([(LStmt GhcRn (Located (body GhcRn)), FreeVars)], thing),
      FreeVars)
rnStmtsWithFreeVars HsStmtContext Name
ctxt Located (body GhcPs) -> RnM (Located (body GhcRn), FreeVars)
rnBody [LStmt GhcPs (Located (body GhcPs))]
stmts [Name] -> RnM (thing, FreeVars)
thing_inside
      ; (pp_stmts :: [LStmt GhcRn (Located (body GhcRn))]
pp_stmts, fvs' :: FreeVars
fvs') <- HsStmtContext Name
-> [(LStmt GhcRn (Located (body GhcRn)), FreeVars)]
-> RnM ([LStmt GhcRn (Located (body GhcRn))], FreeVars)
ppStmts HsStmtContext Name
ctxt [(LStmt GhcRn (Located (body GhcRn)), FreeVars)]
stmts'
      ; (([LStmt GhcRn (Located (body GhcRn))], thing), FreeVars)
-> RnM (([LStmt GhcRn (Located (body GhcRn))], thing), FreeVars)
forall (m :: * -> *) a. Monad m => a -> m a
return (([LStmt GhcRn (Located (body GhcRn))]
pp_stmts, thing
thing), FreeVars
fvs FreeVars -> FreeVars -> FreeVars
`plusFV` FreeVars
fvs')
      }

-- | maybe rearrange statements according to the ApplicativeDo transformation
postProcessStmtsForApplicativeDo
  :: HsStmtContext Name
  -> [(ExprLStmt GhcRn, FreeVars)]
  -> RnM ([ExprLStmt GhcRn], FreeVars)
postProcessStmtsForApplicativeDo :: HsStmtContext Name
-> [(LStmt GhcRn (LHsExpr GhcRn), FreeVars)]
-> RnM ([LStmt GhcRn (LHsExpr GhcRn)], FreeVars)
postProcessStmtsForApplicativeDo ctxt :: HsStmtContext Name
ctxt stmts :: [(LStmt GhcRn (LHsExpr GhcRn), FreeVars)]
stmts
  = do {
       -- rearrange the statements using ApplicativeStmt if
       -- -XApplicativeDo is on.  Also strip out the FreeVars attached
       -- to each Stmt body.
         Bool
ado_is_on <- Extension -> TcRnIf TcGblEnv TcLclEnv Bool
forall gbl lcl. Extension -> TcRnIf gbl lcl Bool
xoptM Extension
LangExt.ApplicativeDo
       ; let is_do_expr :: Bool
is_do_expr | HsStmtContext Name
DoExpr <- HsStmtContext Name
ctxt = Bool
True
                        | Bool
otherwise = Bool
False
       -- don't apply the transformation inside TH brackets, because
       -- DsMeta does not handle ApplicativeDo.
       ; Bool
in_th_bracket <- ThStage -> Bool
isBrackStage (ThStage -> Bool) -> TcM ThStage -> TcRnIf TcGblEnv TcLclEnv Bool
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> TcM ThStage
getStage
       ; if Bool
ado_is_on Bool -> Bool -> Bool
&& Bool
is_do_expr Bool -> Bool -> Bool
&& Bool -> Bool
not Bool
in_th_bracket
            then do { String -> MsgDoc -> IOEnv (Env TcGblEnv TcLclEnv) ()
traceRn "ppsfa" ([(LStmt GhcRn (LHsExpr GhcRn), FreeVars)] -> MsgDoc
forall a. Outputable a => a -> MsgDoc
ppr [(LStmt GhcRn (LHsExpr GhcRn), FreeVars)]
stmts)
                    ; HsStmtContext Name
-> [(LStmt GhcRn (LHsExpr GhcRn), FreeVars)]
-> RnM ([LStmt GhcRn (LHsExpr GhcRn)], FreeVars)
rearrangeForApplicativeDo HsStmtContext Name
ctxt [(LStmt GhcRn (LHsExpr GhcRn), FreeVars)]
stmts }
            else HsStmtContext Name
-> [(LStmt GhcRn (LHsExpr GhcRn), FreeVars)]
-> RnM ([LStmt GhcRn (LHsExpr GhcRn)], FreeVars)
forall (body :: * -> *).
HsStmtContext Name
-> [(LStmt GhcRn (Located (body GhcRn)), FreeVars)]
-> RnM ([LStmt GhcRn (Located (body GhcRn))], FreeVars)
noPostProcessStmts HsStmtContext Name
ctxt [(LStmt GhcRn (LHsExpr GhcRn), FreeVars)]
stmts }

-- | strip the FreeVars annotations from statements
noPostProcessStmts
  :: HsStmtContext Name
  -> [(LStmt GhcRn (Located (body GhcRn)), FreeVars)]
  -> RnM ([LStmt GhcRn (Located (body GhcRn))], FreeVars)
noPostProcessStmts :: HsStmtContext Name
-> [(LStmt GhcRn (Located (body GhcRn)), FreeVars)]
-> RnM ([LStmt GhcRn (Located (body GhcRn))], FreeVars)
noPostProcessStmts _ stmts :: [(LStmt GhcRn (Located (body GhcRn)), FreeVars)]
stmts = ([LStmt GhcRn (Located (body GhcRn))], FreeVars)
-> RnM ([LStmt GhcRn (Located (body GhcRn))], FreeVars)
forall (m :: * -> *) a. Monad m => a -> m a
return (((LStmt GhcRn (Located (body GhcRn)), FreeVars)
 -> LStmt GhcRn (Located (body GhcRn)))
-> [(LStmt GhcRn (Located (body GhcRn)), FreeVars)]
-> [LStmt GhcRn (Located (body GhcRn))]
forall a b. (a -> b) -> [a] -> [b]
map (LStmt GhcRn (Located (body GhcRn)), FreeVars)
-> LStmt GhcRn (Located (body GhcRn))
forall a b. (a, b) -> a
fst [(LStmt GhcRn (Located (body GhcRn)), FreeVars)]
stmts, FreeVars
emptyNameSet)


rnStmtsWithFreeVars :: Outputable (body GhcPs)
        => HsStmtContext Name
        -> (Located (body GhcPs) -> RnM (Located (body GhcRn), FreeVars))
        -> [LStmt GhcPs (Located (body GhcPs))]
        -> ([Name] -> RnM (thing, FreeVars))
        -> RnM ( ([(LStmt GhcRn (Located (body GhcRn)), FreeVars)], thing)
               , FreeVars)
-- Each Stmt body is annotated with its FreeVars, so that
-- we can rearrange statements for ApplicativeDo.
--
-- Variables bound by the Stmts, and mentioned in thing_inside,
-- do not appear in the result FreeVars

rnStmtsWithFreeVars :: HsStmtContext Name
-> (Located (body GhcPs) -> RnM (Located (body GhcRn), FreeVars))
-> [LStmt GhcPs (Located (body GhcPs))]
-> ([Name] -> RnM (thing, FreeVars))
-> RnM
     (([(LStmt GhcRn (Located (body GhcRn)), FreeVars)], thing),
      FreeVars)
rnStmtsWithFreeVars ctxt :: HsStmtContext Name
ctxt _ [] thing_inside :: [Name] -> RnM (thing, FreeVars)
thing_inside
  = do { HsStmtContext Name -> IOEnv (Env TcGblEnv TcLclEnv) ()
checkEmptyStmts HsStmtContext Name
ctxt
       ; (thing :: thing
thing, fvs :: FreeVars
fvs) <- [Name] -> RnM (thing, FreeVars)
thing_inside []
       ; (([(LStmt GhcRn (Located (body GhcRn)), FreeVars)], thing),
 FreeVars)
-> RnM
     (([(LStmt GhcRn (Located (body GhcRn)), FreeVars)], thing),
      FreeVars)
forall (m :: * -> *) a. Monad m => a -> m a
return (([], thing
thing), FreeVars
fvs) }

rnStmtsWithFreeVars MDoExpr rnBody :: Located (body GhcPs) -> RnM (Located (body GhcRn), FreeVars)
rnBody stmts :: [LStmt GhcPs (Located (body GhcPs))]
stmts thing_inside :: [Name] -> RnM (thing, FreeVars)
thing_inside    -- Deal with mdo
  = -- Behave like do { rec { ...all but last... }; last }
    do { ((stmts1 :: [(LStmt GhcRn (Located (body GhcRn)), FreeVars)]
stmts1, (stmts2 :: [(LStmt GhcRn (Located (body GhcRn)), FreeVars)]
stmts2, thing :: thing
thing)), fvs :: FreeVars
fvs)
           <- HsStmtContext Name
-> (Located (body GhcPs) -> RnM (Located (body GhcRn), FreeVars))
-> LStmt GhcPs (Located (body GhcPs))
-> ([Name]
    -> RnM
         (([(LStmt GhcRn (Located (body GhcRn)), FreeVars)], thing),
          FreeVars))
-> RnM
     (([(LStmt GhcRn (Located (body GhcRn)), FreeVars)],
       ([(LStmt GhcRn (Located (body GhcRn)), FreeVars)], thing)),
      FreeVars)
forall (body :: * -> *) thing.
Outputable (body GhcPs) =>
HsStmtContext Name
-> (Located (body GhcPs) -> RnM (Located (body GhcRn), FreeVars))
-> LStmt GhcPs (Located (body GhcPs))
-> ([Name] -> RnM (thing, FreeVars))
-> RnM
     (([(LStmt GhcRn (Located (body GhcRn)), FreeVars)], thing),
      FreeVars)
rnStmt HsStmtContext Name
forall id. HsStmtContext id
MDoExpr Located (body GhcPs) -> RnM (Located (body GhcRn), FreeVars)
rnBody (SrcSpanLess (LStmt GhcPs (Located (body GhcPs)))
-> LStmt GhcPs (Located (body GhcPs))
forall a. HasSrcSpan a => SrcSpanLess a -> a
noLoc (SrcSpanLess (LStmt GhcPs (Located (body GhcPs)))
 -> LStmt GhcPs (Located (body GhcPs)))
-> SrcSpanLess (LStmt GhcPs (Located (body GhcPs)))
-> LStmt GhcPs (Located (body GhcPs))
forall a b. (a -> b) -> a -> b
$ [LStmt GhcPs (Located (body GhcPs))]
-> StmtLR GhcPs GhcPs (Located (body GhcPs))
forall (idL :: Pass) bodyR.
[LStmtLR (GhcPass idL) GhcPs bodyR]
-> StmtLR (GhcPass idL) GhcPs bodyR
mkRecStmt [LStmt GhcPs (Located (body GhcPs))]
all_but_last) (([Name]
  -> RnM
       (([(LStmt GhcRn (Located (body GhcRn)), FreeVars)], thing),
        FreeVars))
 -> RnM
      (([(LStmt GhcRn (Located (body GhcRn)), FreeVars)],
        ([(LStmt GhcRn (Located (body GhcRn)), FreeVars)], thing)),
       FreeVars))
-> ([Name]
    -> RnM
         (([(LStmt GhcRn (Located (body GhcRn)), FreeVars)], thing),
          FreeVars))
-> RnM
     (([(LStmt GhcRn (Located (body GhcRn)), FreeVars)],
       ([(LStmt GhcRn (Located (body GhcRn)), FreeVars)], thing)),
      FreeVars)
forall a b. (a -> b) -> a -> b
$ \ _ ->
              do { LStmt GhcPs (Located (body GhcPs))
last_stmt' <- HsStmtContext Name
-> LStmt GhcPs (Located (body GhcPs))
-> RnM (LStmt GhcPs (Located (body GhcPs)))
forall (body :: * -> *).
Outputable (body GhcPs) =>
HsStmtContext Name
-> LStmt GhcPs (Located (body GhcPs))
-> RnM (LStmt GhcPs (Located (body GhcPs)))
checkLastStmt HsStmtContext Name
forall id. HsStmtContext id
MDoExpr LStmt GhcPs (Located (body GhcPs))
last_stmt
                 ; HsStmtContext Name
-> (Located (body GhcPs) -> RnM (Located (body GhcRn), FreeVars))
-> LStmt GhcPs (Located (body GhcPs))
-> ([Name] -> RnM (thing, FreeVars))
-> RnM
     (([(LStmt GhcRn (Located (body GhcRn)), FreeVars)], thing),
      FreeVars)
forall (body :: * -> *) thing.
Outputable (body GhcPs) =>
HsStmtContext Name
-> (Located (body GhcPs) -> RnM (Located (body GhcRn), FreeVars))
-> LStmt GhcPs (Located (body GhcPs))
-> ([Name] -> RnM (thing, FreeVars))
-> RnM
     (([(LStmt GhcRn (Located (body GhcRn)), FreeVars)], thing),
      FreeVars)
rnStmt HsStmtContext Name
forall id. HsStmtContext id
MDoExpr Located (body GhcPs) -> RnM (Located (body GhcRn), FreeVars)
rnBody LStmt GhcPs (Located (body GhcPs))
last_stmt' [Name] -> RnM (thing, FreeVars)
thing_inside }
        ; (([(LStmt GhcRn (Located (body GhcRn)), FreeVars)], thing),
 FreeVars)
-> RnM
     (([(LStmt GhcRn (Located (body GhcRn)), FreeVars)], thing),
      FreeVars)
forall (m :: * -> *) a. Monad m => a -> m a
return ((([(LStmt GhcRn (Located (body GhcRn)), FreeVars)]
stmts1 [(LStmt GhcRn (Located (body GhcRn)), FreeVars)]
-> [(LStmt GhcRn (Located (body GhcRn)), FreeVars)]
-> [(LStmt GhcRn (Located (body GhcRn)), FreeVars)]
forall a. [a] -> [a] -> [a]
++ [(LStmt GhcRn (Located (body GhcRn)), FreeVars)]
stmts2), thing
thing), FreeVars
fvs) }
  where
    Just (all_but_last :: [LStmt GhcPs (Located (body GhcPs))]
all_but_last, last_stmt :: LStmt GhcPs (Located (body GhcPs))
last_stmt) = [LStmt GhcPs (Located (body GhcPs))]
-> Maybe
     ([LStmt GhcPs (Located (body GhcPs))],
      LStmt GhcPs (Located (body GhcPs)))
forall a. [a] -> Maybe ([a], a)
snocView [LStmt GhcPs (Located (body GhcPs))]
stmts

rnStmtsWithFreeVars ctxt :: HsStmtContext Name
ctxt rnBody :: Located (body GhcPs) -> RnM (Located (body GhcRn), FreeVars)
rnBody (lstmt :: LStmt GhcPs (Located (body GhcPs))
lstmt@(L loc :: SrcSpan
loc _) : lstmts :: [LStmt GhcPs (Located (body GhcPs))]
lstmts) thing_inside :: [Name] -> RnM (thing, FreeVars)
thing_inside
  | [LStmt GhcPs (Located (body GhcPs))] -> Bool
forall (t :: * -> *) a. Foldable t => t a -> Bool
null [LStmt GhcPs (Located (body GhcPs))]
lstmts
  = SrcSpan
-> RnM
     (([(LStmt GhcRn (Located (body GhcRn)), FreeVars)], thing),
      FreeVars)
-> RnM
     (([(LStmt GhcRn (Located (body GhcRn)), FreeVars)], thing),
      FreeVars)
forall a. SrcSpan -> TcRn a -> TcRn a
setSrcSpan SrcSpan
loc (RnM
   (([(LStmt GhcRn (Located (body GhcRn)), FreeVars)], thing),
    FreeVars)
 -> RnM
      (([(LStmt GhcRn (Located (body GhcRn)), FreeVars)], thing),
       FreeVars))
-> RnM
     (([(LStmt GhcRn (Located (body GhcRn)), FreeVars)], thing),
      FreeVars)
-> RnM
     (([(LStmt GhcRn (Located (body GhcRn)), FreeVars)], thing),
      FreeVars)
forall a b. (a -> b) -> a -> b
$
    do { LStmt GhcPs (Located (body GhcPs))
lstmt' <- HsStmtContext Name
-> LStmt GhcPs (Located (body GhcPs))
-> RnM (LStmt GhcPs (Located (body GhcPs)))
forall (body :: * -> *).
Outputable (body GhcPs) =>
HsStmtContext Name
-> LStmt GhcPs (Located (body GhcPs))
-> RnM (LStmt GhcPs (Located (body GhcPs)))
checkLastStmt HsStmtContext Name
ctxt LStmt GhcPs (Located (body GhcPs))
lstmt
       ; HsStmtContext Name
-> (Located (body GhcPs) -> RnM (Located (body GhcRn), FreeVars))
-> LStmt GhcPs (Located (body GhcPs))
-> ([Name] -> RnM (thing, FreeVars))
-> RnM
     (([(LStmt GhcRn (Located (body GhcRn)), FreeVars)], thing),
      FreeVars)
forall (body :: * -> *) thing.
Outputable (body GhcPs) =>
HsStmtContext Name
-> (Located (body GhcPs) -> RnM (Located (body GhcRn), FreeVars))
-> LStmt GhcPs (Located (body GhcPs))
-> ([Name] -> RnM (thing, FreeVars))
-> RnM
     (([(LStmt GhcRn (Located (body GhcRn)), FreeVars)], thing),
      FreeVars)
rnStmt HsStmtContext Name
ctxt Located (body GhcPs) -> RnM (Located (body GhcRn), FreeVars)
rnBody LStmt GhcPs (Located (body GhcPs))
lstmt' [Name] -> RnM (thing, FreeVars)
thing_inside }

  | Bool
otherwise
  = do { ((stmts1 :: [(LStmt GhcRn (Located (body GhcRn)), FreeVars)]
stmts1, (stmts2 :: [(LStmt GhcRn (Located (body GhcRn)), FreeVars)]
stmts2, thing :: thing
thing)), fvs :: FreeVars
fvs)
            <- SrcSpan
-> RnM
     (([(LStmt GhcRn (Located (body GhcRn)), FreeVars)],
       ([(LStmt GhcRn (Located (body GhcRn)), FreeVars)], thing)),
      FreeVars)
-> RnM
     (([(LStmt GhcRn (Located (body GhcRn)), FreeVars)],
       ([(LStmt GhcRn (Located (body GhcRn)), FreeVars)], thing)),
      FreeVars)
forall a. SrcSpan -> TcRn a -> TcRn a
setSrcSpan SrcSpan
loc                         (RnM
   (([(LStmt GhcRn (Located (body GhcRn)), FreeVars)],
     ([(LStmt GhcRn (Located (body GhcRn)), FreeVars)], thing)),
    FreeVars)
 -> RnM
      (([(LStmt GhcRn (Located (body GhcRn)), FreeVars)],
        ([(LStmt GhcRn (Located (body GhcRn)), FreeVars)], thing)),
       FreeVars))
-> RnM
     (([(LStmt GhcRn (Located (body GhcRn)), FreeVars)],
       ([(LStmt GhcRn (Located (body GhcRn)), FreeVars)], thing)),
      FreeVars)
-> RnM
     (([(LStmt GhcRn (Located (body GhcRn)), FreeVars)],
       ([(LStmt GhcRn (Located (body GhcRn)), FreeVars)], thing)),
      FreeVars)
forall a b. (a -> b) -> a -> b
$
               do { HsStmtContext Name
-> LStmt GhcPs (Located (body GhcPs))
-> IOEnv (Env TcGblEnv TcLclEnv) ()
forall (body :: * -> *).
HsStmtContext Name
-> LStmt GhcPs (Located (body GhcPs))
-> IOEnv (Env TcGblEnv TcLclEnv) ()
checkStmt HsStmtContext Name
ctxt LStmt GhcPs (Located (body GhcPs))
lstmt
                  ; HsStmtContext Name
-> (Located (body GhcPs) -> RnM (Located (body GhcRn), FreeVars))
-> LStmt GhcPs (Located (body GhcPs))
-> ([Name]
    -> RnM
         (([(LStmt GhcRn (Located (body GhcRn)), FreeVars)], thing),
          FreeVars))
-> RnM
     (([(LStmt GhcRn (Located (body GhcRn)), FreeVars)],
       ([(LStmt GhcRn (Located (body GhcRn)), FreeVars)], thing)),
      FreeVars)
forall (body :: * -> *) thing.
Outputable (body GhcPs) =>
HsStmtContext Name
-> (Located (body GhcPs) -> RnM (Located (body GhcRn), FreeVars))
-> LStmt GhcPs (Located (body GhcPs))
-> ([Name] -> RnM (thing, FreeVars))
-> RnM
     (([(LStmt GhcRn (Located (body GhcRn)), FreeVars)], thing),
      FreeVars)
rnStmt HsStmtContext Name
ctxt Located (body GhcPs) -> RnM (Located (body GhcRn), FreeVars)
rnBody LStmt GhcPs (Located (body GhcPs))
lstmt    (([Name]
  -> RnM
       (([(LStmt GhcRn (Located (body GhcRn)), FreeVars)], thing),
        FreeVars))
 -> RnM
      (([(LStmt GhcRn (Located (body GhcRn)), FreeVars)],
        ([(LStmt GhcRn (Located (body GhcRn)), FreeVars)], thing)),
       FreeVars))
-> ([Name]
    -> RnM
         (([(LStmt GhcRn (Located (body GhcRn)), FreeVars)], thing),
          FreeVars))
-> RnM
     (([(LStmt GhcRn (Located (body GhcRn)), FreeVars)],
       ([(LStmt GhcRn (Located (body GhcRn)), FreeVars)], thing)),
      FreeVars)
forall a b. (a -> b) -> a -> b
$ \ bndrs1 :: [Name]
bndrs1 ->
                    HsStmtContext Name
-> (Located (body GhcPs) -> RnM (Located (body GhcRn), FreeVars))
-> [LStmt GhcPs (Located (body GhcPs))]
-> ([Name] -> RnM (thing, FreeVars))
-> RnM
     (([(LStmt GhcRn (Located (body GhcRn)), FreeVars)], thing),
      FreeVars)
forall (body :: * -> *) thing.
Outputable (body GhcPs) =>
HsStmtContext Name
-> (Located (body GhcPs) -> RnM (Located (body GhcRn), FreeVars))
-> [LStmt GhcPs (Located (body GhcPs))]
-> ([Name] -> RnM (thing, FreeVars))
-> RnM
     (([(LStmt GhcRn (Located (body GhcRn)), FreeVars)], thing),
      FreeVars)
rnStmtsWithFreeVars HsStmtContext Name
ctxt Located (body GhcPs) -> RnM (Located (body GhcRn), FreeVars)
rnBody [LStmt GhcPs (Located (body GhcPs))]
lstmts  (([Name] -> RnM (thing, FreeVars))
 -> RnM
      (([(LStmt GhcRn (Located (body GhcRn)), FreeVars)], thing),
       FreeVars))
-> ([Name] -> RnM (thing, FreeVars))
-> RnM
     (([(LStmt GhcRn (Located (body GhcRn)), FreeVars)], thing),
      FreeVars)
forall a b. (a -> b) -> a -> b
$ \ bndrs2 :: [Name]
bndrs2 ->
                    [Name] -> RnM (thing, FreeVars)
thing_inside ([Name]
bndrs1 [Name] -> [Name] -> [Name]
forall a. [a] -> [a] -> [a]
++ [Name]
bndrs2) }
        ; (([(LStmt GhcRn (Located (body GhcRn)), FreeVars)], thing),
 FreeVars)
-> RnM
     (([(LStmt GhcRn (Located (body GhcRn)), FreeVars)], thing),
      FreeVars)
forall (m :: * -> *) a. Monad m => a -> m a
return ((([(LStmt GhcRn (Located (body GhcRn)), FreeVars)]
stmts1 [(LStmt GhcRn (Located (body GhcRn)), FreeVars)]
-> [(LStmt GhcRn (Located (body GhcRn)), FreeVars)]
-> [(LStmt GhcRn (Located (body GhcRn)), FreeVars)]
forall a. [a] -> [a] -> [a]
++ [(LStmt GhcRn (Located (body GhcRn)), FreeVars)]
stmts2), thing
thing), FreeVars
fvs) }

----------------------

{-
Note [Failing pattern matches in Stmts]
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Many things desugar to HsStmts including monadic things like `do` and `mdo`
statements, pattern guards, and list comprehensions (see 'HsStmtContext' for an
exhaustive list). How we deal with pattern match failure is context-dependent.

 * In the case of list comprehensions and pattern guards we don't need any 'fail'
   function; the desugarer ignores the fail function field of 'BindStmt' entirely.
 * In the case of monadic contexts (e.g. monad comprehensions, do, and mdo
   expressions) we want pattern match failure to be desugared to the appropriate
   'fail' function (either that of Monad or MonadFail, depending on whether
   -XMonadFailDesugaring is enabled.)

At one point we failed to make this distinction, leading to #11216.
-}

rnStmt :: Outputable (body GhcPs)
       => HsStmtContext Name
       -> (Located (body GhcPs) -> RnM (Located (body GhcRn), FreeVars))
          -- ^ How to rename the body of the statement
       -> LStmt GhcPs (Located (body GhcPs))
          -- ^ The statement
       -> ([Name] -> RnM (thing, FreeVars))
          -- ^ Rename the stuff that this statement scopes over
       -> RnM ( ([(LStmt GhcRn (Located (body GhcRn)), FreeVars)], thing)
              , FreeVars)
-- Variables bound by the Stmt, and mentioned in thing_inside,
-- do not appear in the result FreeVars

rnStmt :: HsStmtContext Name
-> (Located (body GhcPs) -> RnM (Located (body GhcRn), FreeVars))
-> LStmt GhcPs (Located (body GhcPs))
-> ([Name] -> RnM (thing, FreeVars))
-> RnM
     (([(LStmt GhcRn (Located (body GhcRn)), FreeVars)], thing),
      FreeVars)
rnStmt ctxt :: HsStmtContext Name
ctxt rnBody :: Located (body GhcPs) -> RnM (Located (body GhcRn), FreeVars)
rnBody (L loc :: SrcSpan
loc (LastStmt _ body :: Located (body GhcPs)
body noret :: Bool
noret _)) thing_inside :: [Name] -> RnM (thing, FreeVars)
thing_inside
  = do  { (body' :: Located (body GhcRn)
body', fv_expr :: FreeVars
fv_expr) <- Located (body GhcPs) -> RnM (Located (body GhcRn), FreeVars)
rnBody Located (body GhcPs)
body
        ; (ret_op :: SyntaxExpr GhcRn
ret_op, fvs1 :: FreeVars
fvs1) <- if HsStmtContext Name -> Bool
forall id. HsStmtContext id -> Bool
isMonadCompContext HsStmtContext Name
ctxt
                            then HsStmtContext Name -> Name -> RnM (SyntaxExpr GhcRn, FreeVars)
lookupStmtName HsStmtContext Name
ctxt Name
returnMName
                            else (SyntaxExpr GhcRn, FreeVars) -> RnM (SyntaxExpr GhcRn, FreeVars)
forall (m :: * -> *) a. Monad m => a -> m a
return (SyntaxExpr GhcRn
forall (p :: Pass). SyntaxExpr (GhcPass p)
noSyntaxExpr, FreeVars
emptyFVs)
                            -- The 'return' in a LastStmt is used only
                            -- for MonadComp; and we don't want to report
                            -- "non in scope: return" in other cases
                            -- Trac #15607

        ; (thing :: thing
thing,  fvs3 :: FreeVars
fvs3) <- [Name] -> RnM (thing, FreeVars)
thing_inside []
        ; (([(LStmt GhcRn (Located (body GhcRn)), FreeVars)], thing),
 FreeVars)
-> RnM
     (([(LStmt GhcRn (Located (body GhcRn)), FreeVars)], thing),
      FreeVars)
forall (m :: * -> *) a. Monad m => a -> m a
return (([(SrcSpan
-> StmtLR GhcRn GhcRn (Located (body GhcRn))
-> LStmt GhcRn (Located (body GhcRn))
forall l e. l -> e -> GenLocated l e
L SrcSpan
loc (XLastStmt GhcRn GhcRn (Located (body GhcRn))
-> Located (body GhcRn)
-> Bool
-> SyntaxExpr GhcRn
-> StmtLR GhcRn GhcRn (Located (body GhcRn))
forall idL idR body.
XLastStmt idL idR body
-> body -> Bool -> SyntaxExpr idR -> StmtLR idL idR body
LastStmt XLastStmt GhcRn GhcRn (Located (body GhcRn))
NoExt
noExt Located (body GhcRn)
body' Bool
noret SyntaxExpr GhcRn
ret_op), FreeVars
fv_expr)]
                  , thing
thing), FreeVars
fv_expr FreeVars -> FreeVars -> FreeVars
`plusFV` FreeVars
fvs1 FreeVars -> FreeVars -> FreeVars
`plusFV` FreeVars
fvs3) }

rnStmt ctxt :: HsStmtContext Name
ctxt rnBody :: Located (body GhcPs) -> RnM (Located (body GhcRn), FreeVars)
rnBody (L loc :: SrcSpan
loc (BodyStmt _ body :: Located (body GhcPs)
body _ _)) thing_inside :: [Name] -> RnM (thing, FreeVars)
thing_inside
  = do  { (body' :: Located (body GhcRn)
body', fv_expr :: FreeVars
fv_expr) <- Located (body GhcPs) -> RnM (Located (body GhcRn), FreeVars)
rnBody Located (body GhcPs)
body
        ; (then_op :: SyntaxExpr GhcRn
then_op, fvs1 :: FreeVars
fvs1)  <- HsStmtContext Name -> Name -> RnM (SyntaxExpr GhcRn, FreeVars)
lookupStmtName HsStmtContext Name
ctxt Name
thenMName

        ; (guard_op :: SyntaxExpr GhcRn
guard_op, fvs2 :: FreeVars
fvs2) <- if HsStmtContext Name -> Bool
forall id. HsStmtContext id -> Bool
isComprehensionContext HsStmtContext Name
ctxt
                              then HsStmtContext Name -> Name -> RnM (SyntaxExpr GhcRn, FreeVars)
lookupStmtName HsStmtContext Name
ctxt Name
guardMName
                              else (SyntaxExpr GhcRn, FreeVars) -> RnM (SyntaxExpr GhcRn, FreeVars)
forall (m :: * -> *) a. Monad m => a -> m a
return (SyntaxExpr GhcRn
forall (p :: Pass). SyntaxExpr (GhcPass p)
noSyntaxExpr, FreeVars
emptyFVs)
                              -- Only list/monad comprehensions use 'guard'
                              -- Also for sub-stmts of same eg [ e | x<-xs, gd | blah ]
                              -- Here "gd" is a guard

        ; (thing :: thing
thing, fvs3 :: FreeVars
fvs3)    <- [Name] -> RnM (thing, FreeVars)
thing_inside []
        ; (([(LStmt GhcRn (Located (body GhcRn)), FreeVars)], thing),
 FreeVars)
-> RnM
     (([(LStmt GhcRn (Located (body GhcRn)), FreeVars)], thing),
      FreeVars)
forall (m :: * -> *) a. Monad m => a -> m a
return ( ([(SrcSpan
-> StmtLR GhcRn GhcRn (Located (body GhcRn))
-> LStmt GhcRn (Located (body GhcRn))
forall l e. l -> e -> GenLocated l e
L SrcSpan
loc (XBodyStmt GhcRn GhcRn (Located (body GhcRn))
-> Located (body GhcRn)
-> SyntaxExpr GhcRn
-> SyntaxExpr GhcRn
-> StmtLR GhcRn GhcRn (Located (body GhcRn))
forall idL idR body.
XBodyStmt idL idR body
-> body -> SyntaxExpr idR -> SyntaxExpr idR -> StmtLR idL idR body
BodyStmt XBodyStmt GhcRn GhcRn (Located (body GhcRn))
NoExt
noExt Located (body GhcRn)
body' SyntaxExpr GhcRn
then_op SyntaxExpr GhcRn
guard_op), FreeVars
fv_expr)]
                  , thing
thing), FreeVars
fv_expr FreeVars -> FreeVars -> FreeVars
`plusFV` FreeVars
fvs1 FreeVars -> FreeVars -> FreeVars
`plusFV` FreeVars
fvs2 FreeVars -> FreeVars -> FreeVars
`plusFV` FreeVars
fvs3) }

rnStmt ctxt :: HsStmtContext Name
ctxt rnBody :: Located (body GhcPs) -> RnM (Located (body GhcRn), FreeVars)
rnBody (L loc :: SrcSpan
loc (BindStmt _ pat :: LPat GhcPs
pat body :: Located (body GhcPs)
body _ _)) thing_inside :: [Name] -> RnM (thing, FreeVars)
thing_inside
  = do  { (body' :: Located (body GhcRn)
body', fv_expr :: FreeVars
fv_expr) <- Located (body GhcPs) -> RnM (Located (body GhcRn), FreeVars)
rnBody Located (body GhcPs)
body
                -- The binders do not scope over the expression
        ; (bind_op :: SyntaxExpr GhcRn
bind_op, fvs1 :: FreeVars
fvs1) <- HsStmtContext Name -> Name -> RnM (SyntaxExpr GhcRn, FreeVars)
lookupStmtName HsStmtContext Name
ctxt Name
bindMName

        ; (fail_op :: SyntaxExpr GhcRn
fail_op, fvs2 :: FreeVars
fvs2) <- LPat GhcPs
-> HsStmtContext Name -> RnM (SyntaxExpr GhcRn, FreeVars)
monadFailOp LPat GhcPs
pat HsStmtContext Name
ctxt

        ; HsMatchContext Name
-> LPat GhcPs
-> (LPat GhcRn
    -> RnM
         (([(LStmt GhcRn (Located (body GhcRn)), FreeVars)], thing),
          FreeVars))
-> RnM
     (([(LStmt GhcRn (Located (body GhcRn)), FreeVars)], thing),
      FreeVars)
forall a.
HsMatchContext Name
-> LPat GhcPs
-> (LPat GhcRn -> RnM (a, FreeVars))
-> RnM (a, FreeVars)
rnPat (HsStmtContext Name -> HsMatchContext Name
forall id. HsStmtContext id -> HsMatchContext id
StmtCtxt HsStmtContext Name
ctxt) LPat GhcPs
pat ((LPat GhcRn
  -> RnM
       (([(LStmt GhcRn (Located (body GhcRn)), FreeVars)], thing),
        FreeVars))
 -> RnM
      (([(LStmt GhcRn (Located (body GhcRn)), FreeVars)], thing),
       FreeVars))
-> (LPat GhcRn
    -> RnM
         (([(LStmt GhcRn (Located (body GhcRn)), FreeVars)], thing),
          FreeVars))
-> RnM
     (([(LStmt GhcRn (Located (body GhcRn)), FreeVars)], thing),
      FreeVars)
forall a b. (a -> b) -> a -> b
$ \ pat' :: LPat GhcRn
pat' -> do
        { (thing :: thing
thing, fvs3 :: FreeVars
fvs3) <- [Name] -> RnM (thing, FreeVars)
thing_inside (LPat GhcRn -> [IdP GhcRn]
forall (p :: Pass). LPat (GhcPass p) -> [IdP (GhcPass p)]
collectPatBinders LPat GhcRn
pat')
        ; (([(LStmt GhcRn (Located (body GhcRn)), FreeVars)], thing),
 FreeVars)
-> RnM
     (([(LStmt GhcRn (Located (body GhcRn)), FreeVars)], thing),
      FreeVars)
forall (m :: * -> *) a. Monad m => a -> m a
return (( [( SrcSpan
-> StmtLR GhcRn GhcRn (Located (body GhcRn))
-> LStmt GhcRn (Located (body GhcRn))
forall l e. l -> e -> GenLocated l e
L SrcSpan
loc (XBindStmt GhcRn GhcRn (Located (body GhcRn))
-> LPat GhcRn
-> Located (body GhcRn)
-> SyntaxExpr GhcRn
-> SyntaxExpr GhcRn
-> StmtLR GhcRn GhcRn (Located (body GhcRn))
forall idL idR body.
XBindStmt idL idR body
-> LPat idL
-> body
-> SyntaxExpr idR
-> SyntaxExpr idR
-> StmtLR idL idR body
BindStmt XBindStmt GhcRn GhcRn (Located (body GhcRn))
NoExt
noExt LPat GhcRn
pat' Located (body GhcRn)
body' SyntaxExpr GhcRn
bind_op SyntaxExpr GhcRn
fail_op)
                     , FreeVars
fv_expr )]
                  , thing
thing),
                  FreeVars
fv_expr FreeVars -> FreeVars -> FreeVars
`plusFV` FreeVars
fvs1 FreeVars -> FreeVars -> FreeVars
`plusFV` FreeVars
fvs2 FreeVars -> FreeVars -> FreeVars
`plusFV` FreeVars
fvs3) }}
       -- fv_expr shouldn't really be filtered by the rnPatsAndThen
        -- but it does not matter because the names are unique

rnStmt _ _ (L loc :: SrcSpan
loc (LetStmt _ (L l :: SrcSpan
l binds :: HsLocalBinds GhcPs
binds))) thing_inside :: [Name] -> RnM (thing, FreeVars)
thing_inside
  = do  { HsLocalBinds GhcPs
-> (HsLocalBinds GhcRn
    -> FreeVars
    -> RnM
         (([(LStmt GhcRn (Located (body GhcRn)), FreeVars)], thing),
          FreeVars))
-> RnM
     (([(LStmt GhcRn (Located (body GhcRn)), FreeVars)], thing),
      FreeVars)
forall result.
HsLocalBinds GhcPs
-> (HsLocalBinds GhcRn -> FreeVars -> RnM (result, FreeVars))
-> RnM (result, FreeVars)
rnLocalBindsAndThen HsLocalBinds GhcPs
binds ((HsLocalBinds GhcRn
  -> FreeVars
  -> RnM
       (([(LStmt GhcRn (Located (body GhcRn)), FreeVars)], thing),
        FreeVars))
 -> RnM
      (([(LStmt GhcRn (Located (body GhcRn)), FreeVars)], thing),
       FreeVars))
-> (HsLocalBinds GhcRn
    -> FreeVars
    -> RnM
         (([(LStmt GhcRn (Located (body GhcRn)), FreeVars)], thing),
          FreeVars))
-> RnM
     (([(LStmt GhcRn (Located (body GhcRn)), FreeVars)], thing),
      FreeVars)
forall a b. (a -> b) -> a -> b
$ \binds' :: HsLocalBinds GhcRn
binds' bind_fvs :: FreeVars
bind_fvs -> do
        { (thing :: thing
thing, fvs :: FreeVars
fvs) <- [Name] -> RnM (thing, FreeVars)
thing_inside (HsLocalBinds GhcRn -> [IdP GhcRn]
forall (idL :: Pass) (idR :: Pass).
HsLocalBindsLR (GhcPass idL) (GhcPass idR) -> [IdP (GhcPass idL)]
collectLocalBinders HsLocalBinds GhcRn
binds')
        ; (([(LStmt GhcRn (Located (body GhcRn)), FreeVars)], thing),
 FreeVars)
-> RnM
     (([(LStmt GhcRn (Located (body GhcRn)), FreeVars)], thing),
      FreeVars)
forall (m :: * -> *) a. Monad m => a -> m a
return ( ([(SrcSpan
-> StmtLR GhcRn GhcRn (Located (body GhcRn))
-> LStmt GhcRn (Located (body GhcRn))
forall l e. l -> e -> GenLocated l e
L SrcSpan
loc (XLetStmt GhcRn GhcRn (Located (body GhcRn))
-> LHsLocalBinds GhcRn -> StmtLR GhcRn GhcRn (Located (body GhcRn))
forall idL idR body.
XLetStmt idL idR body
-> LHsLocalBindsLR idL idR -> StmtLR idL idR body
LetStmt XLetStmt GhcRn GhcRn (Located (body GhcRn))
NoExt
noExt (SrcSpan -> HsLocalBinds GhcRn -> LHsLocalBinds GhcRn
forall l e. l -> e -> GenLocated l e
L SrcSpan
l HsLocalBinds GhcRn
binds')), FreeVars
bind_fvs)], thing
thing)
                 , FreeVars
fvs) }  }

rnStmt ctxt :: HsStmtContext Name
ctxt rnBody :: Located (body GhcPs) -> RnM (Located (body GhcRn), FreeVars)
rnBody (L loc :: SrcSpan
loc (RecStmt { recS_stmts :: forall idL idR body. StmtLR idL idR body -> [LStmtLR idL idR body]
recS_stmts = [LStmt GhcPs (Located (body GhcPs))]
rec_stmts })) thing_inside :: [Name] -> RnM (thing, FreeVars)
thing_inside
  = do  { (return_op :: SyntaxExpr GhcRn
return_op, fvs1 :: FreeVars
fvs1)  <- HsStmtContext Name -> Name -> RnM (SyntaxExpr GhcRn, FreeVars)
lookupStmtName HsStmtContext Name
ctxt Name
returnMName
        ; (mfix_op :: SyntaxExpr GhcRn
mfix_op,   fvs2 :: FreeVars
fvs2)  <- HsStmtContext Name -> Name -> RnM (SyntaxExpr GhcRn, FreeVars)
lookupStmtName HsStmtContext Name
ctxt Name
mfixName
        ; (bind_op :: SyntaxExpr GhcRn
bind_op,   fvs3 :: FreeVars
fvs3)  <- HsStmtContext Name -> Name -> RnM (SyntaxExpr GhcRn, FreeVars)
lookupStmtName HsStmtContext Name
ctxt Name
bindMName
        ; let empty_rec_stmt :: StmtLR GhcRn GhcRn (Located (body GhcRn))
empty_rec_stmt = StmtLR GhcRn GhcRn (Located (body GhcRn))
forall bodyR. StmtLR GhcRn GhcRn bodyR
emptyRecStmtName { recS_ret_fn :: SyntaxExpr GhcRn
recS_ret_fn  = SyntaxExpr GhcRn
return_op
                                                , recS_mfix_fn :: SyntaxExpr GhcRn
recS_mfix_fn = SyntaxExpr GhcRn
mfix_op
                                                , recS_bind_fn :: SyntaxExpr GhcRn
recS_bind_fn = SyntaxExpr GhcRn
bind_op }

        -- Step1: Bring all the binders of the mdo into scope
        -- (Remember that this also removes the binders from the
        -- finally-returned free-vars.)
        -- And rename each individual stmt, making a
        -- singleton segment.  At this stage the FwdRefs field
        -- isn't finished: it's empty for all except a BindStmt
        -- for which it's the fwd refs within the bind itself
        -- (This set may not be empty, because we're in a recursive
        -- context.)
        ; (Located (body GhcPs) -> RnM (Located (body GhcRn), FreeVars))
-> [LStmt GhcPs (Located (body GhcPs))]
-> ([Segment (LStmt GhcRn (Located (body GhcRn)))]
    -> RnM
         (([(LStmt GhcRn (Located (body GhcRn)), FreeVars)], thing),
          FreeVars))
-> RnM
     (([(LStmt GhcRn (Located (body GhcRn)), FreeVars)], thing),
      FreeVars)
forall (body :: * -> *) a.
Outputable (body GhcPs) =>
(Located (body GhcPs) -> RnM (Located (body GhcRn), FreeVars))
-> [LStmt GhcPs (Located (body GhcPs))]
-> ([Segment (LStmt GhcRn (Located (body GhcRn)))]
    -> RnM (a, FreeVars))
-> RnM (a, FreeVars)
rnRecStmtsAndThen Located (body GhcPs) -> RnM (Located (body GhcRn), FreeVars)
rnBody [LStmt GhcPs (Located (body GhcPs))]
rec_stmts   (([Segment (LStmt GhcRn (Located (body GhcRn)))]
  -> RnM
       (([(LStmt GhcRn (Located (body GhcRn)), FreeVars)], thing),
        FreeVars))
 -> RnM
      (([(LStmt GhcRn (Located (body GhcRn)), FreeVars)], thing),
       FreeVars))
-> ([Segment (LStmt GhcRn (Located (body GhcRn)))]
    -> RnM
         (([(LStmt GhcRn (Located (body GhcRn)), FreeVars)], thing),
          FreeVars))
-> RnM
     (([(LStmt GhcRn (Located (body GhcRn)), FreeVars)], thing),
      FreeVars)
forall a b. (a -> b) -> a -> b
$ \ segs :: [Segment (LStmt GhcRn (Located (body GhcRn)))]
segs -> do
        { let bndrs :: [Name]
bndrs = FreeVars -> [Name]
nameSetElemsStable (FreeVars -> [Name]) -> FreeVars -> [Name]
forall a b. (a -> b) -> a -> b
$
                        (Segment (LStmt GhcRn (Located (body GhcRn)))
 -> FreeVars -> FreeVars)
-> FreeVars
-> [Segment (LStmt GhcRn (Located (body GhcRn)))]
-> FreeVars
forall (t :: * -> *) a b.
Foldable t =>
(a -> b -> b) -> b -> t a -> b
foldr (FreeVars -> FreeVars -> FreeVars
unionNameSet (FreeVars -> FreeVars -> FreeVars)
-> (Segment (LStmt GhcRn (Located (body GhcRn))) -> FreeVars)
-> Segment (LStmt GhcRn (Located (body GhcRn)))
-> FreeVars
-> FreeVars
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (\(ds :: FreeVars
ds,_,_,_) -> FreeVars
ds))
                              FreeVars
emptyNameSet
                              [Segment (LStmt GhcRn (Located (body GhcRn)))]
segs
          -- See Note [Deterministic ApplicativeDo and RecursiveDo desugaring]
        ; (thing :: thing
thing, fvs_later :: FreeVars
fvs_later) <- [Name] -> RnM (thing, FreeVars)
thing_inside [Name]
bndrs
        ; let (rec_stmts' :: [LStmt GhcRn (Located (body GhcRn))]
rec_stmts', fvs :: FreeVars
fvs) = SrcSpan
-> HsStmtContext Name
-> StmtLR GhcRn GhcRn (Located (body GhcRn))
-> [Segment (LStmt GhcRn (Located (body GhcRn)))]
-> FreeVars
-> ([LStmt GhcRn (Located (body GhcRn))], FreeVars)
forall body.
SrcSpan
-> HsStmtContext Name
-> Stmt GhcRn body
-> [Segment (LStmt GhcRn body)]
-> FreeVars
-> ([LStmt GhcRn body], FreeVars)
segmentRecStmts SrcSpan
loc HsStmtContext Name
ctxt StmtLR GhcRn GhcRn (Located (body GhcRn))
empty_rec_stmt [Segment (LStmt GhcRn (Located (body GhcRn)))]
segs FreeVars
fvs_later
        -- We aren't going to try to group RecStmts with
        -- ApplicativeDo, so attaching empty FVs is fine.
        ; (([(LStmt GhcRn (Located (body GhcRn)), FreeVars)], thing),
 FreeVars)
-> RnM
     (([(LStmt GhcRn (Located (body GhcRn)), FreeVars)], thing),
      FreeVars)
forall (m :: * -> *) a. Monad m => a -> m a
return ( (([LStmt GhcRn (Located (body GhcRn))]
-> [FreeVars] -> [(LStmt GhcRn (Located (body GhcRn)), FreeVars)]
forall a b. [a] -> [b] -> [(a, b)]
zip [LStmt GhcRn (Located (body GhcRn))]
rec_stmts' (FreeVars -> [FreeVars]
forall a. a -> [a]
repeat FreeVars
emptyNameSet)), thing
thing)
                 , FreeVars
fvs FreeVars -> FreeVars -> FreeVars
`plusFV` FreeVars
fvs1 FreeVars -> FreeVars -> FreeVars
`plusFV` FreeVars
fvs2 FreeVars -> FreeVars -> FreeVars
`plusFV` FreeVars
fvs3) } }

rnStmt ctxt :: HsStmtContext Name
ctxt _ (L loc :: SrcSpan
loc (ParStmt _ segs :: [ParStmtBlock GhcPs GhcPs]
segs _ _)) thing_inside :: [Name] -> RnM (thing, FreeVars)
thing_inside
  = do  { (mzip_op :: HsExpr GhcRn
mzip_op, fvs1 :: FreeVars
fvs1)   <- HsStmtContext Name -> Name -> RnM (HsExpr GhcRn, FreeVars)
lookupStmtNamePoly HsStmtContext Name
ctxt Name
mzipName
        ; (bind_op :: SyntaxExpr GhcRn
bind_op, fvs2 :: FreeVars
fvs2)   <- HsStmtContext Name -> Name -> RnM (SyntaxExpr GhcRn, FreeVars)
lookupStmtName HsStmtContext Name
ctxt Name
bindMName
        ; (return_op :: SyntaxExpr GhcRn
return_op, fvs3 :: FreeVars
fvs3) <- HsStmtContext Name -> Name -> RnM (SyntaxExpr GhcRn, FreeVars)
lookupStmtName HsStmtContext Name
ctxt Name
returnMName
        ; ((segs' :: [ParStmtBlock GhcRn GhcRn]
segs', thing :: thing
thing), fvs4 :: FreeVars
fvs4) <- HsStmtContext Name
-> SyntaxExpr GhcRn
-> [ParStmtBlock GhcPs GhcPs]
-> ([Name] -> RnM (thing, FreeVars))
-> RnM (([ParStmtBlock GhcRn GhcRn], thing), FreeVars)
forall thing.
HsStmtContext Name
-> SyntaxExpr GhcRn
-> [ParStmtBlock GhcPs GhcPs]
-> ([Name] -> RnM (thing, FreeVars))
-> RnM (([ParStmtBlock GhcRn GhcRn], thing), FreeVars)
rnParallelStmts (HsStmtContext Name -> HsStmtContext Name
forall id. HsStmtContext id -> HsStmtContext id
ParStmtCtxt HsStmtContext Name
ctxt) SyntaxExpr GhcRn
return_op [ParStmtBlock GhcPs GhcPs]
segs [Name] -> RnM (thing, FreeVars)
thing_inside
        ; (([(LStmt GhcRn (Located (body GhcRn)), FreeVars)], thing),
 FreeVars)
-> RnM
     (([(LStmt GhcRn (Located (body GhcRn)), FreeVars)], thing),
      FreeVars)
forall (m :: * -> *) a. Monad m => a -> m a
return (([(SrcSpan
-> StmtLR GhcRn GhcRn (Located (body GhcRn))
-> LStmt GhcRn (Located (body GhcRn))
forall l e. l -> e -> GenLocated l e
L SrcSpan
loc (XParStmt GhcRn GhcRn (Located (body GhcRn))
-> [ParStmtBlock GhcRn GhcRn]
-> HsExpr GhcRn
-> SyntaxExpr GhcRn
-> StmtLR GhcRn GhcRn (Located (body GhcRn))
forall idL idR body.
XParStmt idL idR body
-> [ParStmtBlock idL idR]
-> HsExpr idR
-> SyntaxExpr idR
-> StmtLR idL idR body
ParStmt XParStmt GhcRn GhcRn (Located (body GhcRn))
NoExt
noExt [ParStmtBlock GhcRn GhcRn]
segs' HsExpr GhcRn
mzip_op SyntaxExpr GhcRn
bind_op), FreeVars
fvs4)], thing
thing)
                 , FreeVars
fvs1 FreeVars -> FreeVars -> FreeVars
`plusFV` FreeVars
fvs2 FreeVars -> FreeVars -> FreeVars
`plusFV` FreeVars
fvs3 FreeVars -> FreeVars -> FreeVars
`plusFV` FreeVars
fvs4) }

rnStmt ctxt :: HsStmtContext Name
ctxt _ (L loc :: SrcSpan
loc (TransStmt { trS_stmts :: forall idL idR body. StmtLR idL idR body -> [ExprLStmt idL]
trS_stmts = [ExprLStmt GhcPs]
stmts, trS_by :: forall idL idR body. StmtLR idL idR body -> Maybe (LHsExpr idR)
trS_by = Maybe (LHsExpr GhcPs)
by, trS_form :: forall idL idR body. StmtLR idL idR body -> TransForm
trS_form = TransForm
form
                              , trS_using :: forall idL idR body. StmtLR idL idR body -> LHsExpr idR
trS_using = LHsExpr GhcPs
using })) thing_inside :: [Name] -> RnM (thing, FreeVars)
thing_inside
  = do { -- Rename the 'using' expression in the context before the transform is begun
         (using' :: LHsExpr GhcRn
using', fvs1 :: FreeVars
fvs1) <- LHsExpr GhcPs -> RnM (LHsExpr GhcRn, FreeVars)
rnLExpr LHsExpr GhcPs
using

         -- Rename the stmts and the 'by' expression
         -- Keep track of the variables mentioned in the 'by' expression
       ; ((stmts' :: [LStmt GhcRn (LHsExpr GhcRn)]
stmts', (by' :: Maybe (LHsExpr GhcRn)
by', used_bndrs :: [Name]
used_bndrs, thing :: thing
thing)), fvs2 :: FreeVars
fvs2)
             <- HsStmtContext Name
-> (LHsExpr GhcPs -> RnM (LHsExpr GhcRn, FreeVars))
-> [ExprLStmt GhcPs]
-> ([Name]
    -> RnM ((Maybe (LHsExpr GhcRn), [Name], thing), FreeVars))
-> RnM
     (([LStmt GhcRn (LHsExpr GhcRn)],
       (Maybe (LHsExpr GhcRn), [Name], thing)),
      FreeVars)
forall (body :: * -> *) thing.
Outputable (body GhcPs) =>
HsStmtContext Name
-> (Located (body GhcPs) -> RnM (Located (body GhcRn), FreeVars))
-> [LStmt GhcPs (Located (body GhcPs))]
-> ([Name] -> RnM (thing, FreeVars))
-> RnM (([LStmt GhcRn (Located (body GhcRn))], thing), FreeVars)
rnStmts (HsStmtContext Name -> HsStmtContext Name
forall id. HsStmtContext id -> HsStmtContext id
TransStmtCtxt HsStmtContext Name
ctxt) LHsExpr GhcPs -> RnM (LHsExpr GhcRn, FreeVars)
rnLExpr [ExprLStmt GhcPs]
stmts (([Name] -> RnM ((Maybe (LHsExpr GhcRn), [Name], thing), FreeVars))
 -> RnM
      (([LStmt GhcRn (LHsExpr GhcRn)],
        (Maybe (LHsExpr GhcRn), [Name], thing)),
       FreeVars))
-> ([Name]
    -> RnM ((Maybe (LHsExpr GhcRn), [Name], thing), FreeVars))
-> RnM
     (([LStmt GhcRn (LHsExpr GhcRn)],
       (Maybe (LHsExpr GhcRn), [Name], thing)),
      FreeVars)
forall a b. (a -> b) -> a -> b
$ \ bndrs :: [Name]
bndrs ->
                do { (by' :: Maybe (LHsExpr GhcRn)
by',   fvs_by :: FreeVars
fvs_by) <- (LHsExpr GhcPs -> RnM (LHsExpr GhcRn, FreeVars))
-> Maybe (LHsExpr GhcPs) -> RnM (Maybe (LHsExpr GhcRn), FreeVars)
forall a b.
(a -> RnM (b, FreeVars)) -> Maybe a -> RnM (Maybe b, FreeVars)
mapMaybeFvRn LHsExpr GhcPs -> RnM (LHsExpr GhcRn, FreeVars)
rnLExpr Maybe (LHsExpr GhcPs)
by
                   ; (thing :: thing
thing, fvs_thing :: FreeVars
fvs_thing) <- [Name] -> RnM (thing, FreeVars)
thing_inside [Name]
bndrs
                   ; let fvs :: FreeVars
fvs = FreeVars
fvs_by FreeVars -> FreeVars -> FreeVars
`plusFV` FreeVars
fvs_thing
                         used_bndrs :: [Name]
used_bndrs = (Name -> Bool) -> [Name] -> [Name]
forall a. (a -> Bool) -> [a] -> [a]
filter (Name -> FreeVars -> Bool
`elemNameSet` FreeVars
fvs) [Name]
bndrs
                         -- The paper (Fig 5) has a bug here; we must treat any free variable
                         -- of the "thing inside", **or of the by-expression**, as used
                   ; ((Maybe (LHsExpr GhcRn), [Name], thing), FreeVars)
-> RnM ((Maybe (LHsExpr GhcRn), [Name], thing), FreeVars)
forall (m :: * -> *) a. Monad m => a -> m a
return ((Maybe (LHsExpr GhcRn)
by', [Name]
used_bndrs, thing
thing), FreeVars
fvs) }

       -- Lookup `return`, `(>>=)` and `liftM` for monad comprehensions
       ; (return_op :: SyntaxExpr GhcRn
return_op, fvs3 :: FreeVars
fvs3) <- HsStmtContext Name -> Name -> RnM (SyntaxExpr GhcRn, FreeVars)
lookupStmtName HsStmtContext Name
ctxt Name
returnMName
       ; (bind_op :: SyntaxExpr GhcRn
bind_op,   fvs4 :: FreeVars
fvs4) <- HsStmtContext Name -> Name -> RnM (SyntaxExpr GhcRn, FreeVars)
lookupStmtName HsStmtContext Name
ctxt Name
bindMName
       ; (fmap_op :: HsExpr GhcRn
fmap_op,   fvs5 :: FreeVars
fvs5) <- case TransForm
form of
                                ThenForm -> (HsExpr GhcRn, FreeVars) -> RnM (HsExpr GhcRn, FreeVars)
forall (m :: * -> *) a. Monad m => a -> m a
return (HsExpr GhcRn
forall (id :: Pass). HsExpr (GhcPass id)
noExpr, FreeVars
emptyFVs)
                                _        -> HsStmtContext Name -> Name -> RnM (HsExpr GhcRn, FreeVars)
lookupStmtNamePoly HsStmtContext Name
ctxt Name
fmapName

       ; let all_fvs :: FreeVars
all_fvs  = FreeVars
fvs1 FreeVars -> FreeVars -> FreeVars
`plusFV` FreeVars
fvs2 FreeVars -> FreeVars -> FreeVars
`plusFV` FreeVars
fvs3
                             FreeVars -> FreeVars -> FreeVars
`plusFV` FreeVars
fvs4 FreeVars -> FreeVars -> FreeVars
`plusFV` FreeVars
fvs5
             bndr_map :: [(Name, Name)]
bndr_map = [Name]
used_bndrs [Name] -> [Name] -> [(Name, Name)]
forall a b. [a] -> [b] -> [(a, b)]
`zip` [Name]
used_bndrs
             -- See Note [TransStmt binder map] in HsExpr

       ; String -> MsgDoc -> IOEnv (Env TcGblEnv TcLclEnv) ()
traceRn "rnStmt: implicitly rebound these used binders:" ([(Name, Name)] -> MsgDoc
forall a. Outputable a => a -> MsgDoc
ppr [(Name, Name)]
bndr_map)
       ; (([(LStmt GhcRn (Located (body GhcRn)), FreeVars)], thing),
 FreeVars)
-> RnM
     (([(LStmt GhcRn (Located (body GhcRn)), FreeVars)], thing),
      FreeVars)
forall (m :: * -> *) a. Monad m => a -> m a
return (([(SrcSpan
-> StmtLR GhcRn GhcRn (Located (body GhcRn))
-> LStmt GhcRn (Located (body GhcRn))
forall l e. l -> e -> GenLocated l e
L SrcSpan
loc (TransStmt :: forall idL idR body.
XTransStmt idL idR body
-> TransForm
-> [ExprLStmt idL]
-> [(IdP idR, IdP idR)]
-> LHsExpr idR
-> Maybe (LHsExpr idR)
-> SyntaxExpr idR
-> SyntaxExpr idR
-> HsExpr idR
-> StmtLR idL idR body
TransStmt { trS_ext :: XTransStmt GhcRn GhcRn (Located (body GhcRn))
trS_ext = XTransStmt GhcRn GhcRn (Located (body GhcRn))
NoExt
noExt
                                    , trS_stmts :: [LStmt GhcRn (LHsExpr GhcRn)]
trS_stmts = [LStmt GhcRn (LHsExpr GhcRn)]
stmts', trS_bndrs :: [(IdP GhcRn, IdP GhcRn)]
trS_bndrs = [(Name, Name)]
[(IdP GhcRn, IdP GhcRn)]
bndr_map
                                    , trS_by :: Maybe (LHsExpr GhcRn)
trS_by = Maybe (LHsExpr GhcRn)
by', trS_using :: LHsExpr GhcRn
trS_using = LHsExpr GhcRn
using', trS_form :: TransForm
trS_form = TransForm
form
                                    , trS_ret :: SyntaxExpr GhcRn
trS_ret = SyntaxExpr GhcRn
return_op, trS_bind :: SyntaxExpr GhcRn
trS_bind = SyntaxExpr GhcRn
bind_op
                                    , trS_fmap :: HsExpr GhcRn
trS_fmap = HsExpr GhcRn
fmap_op }), FreeVars
fvs2)], thing
thing), FreeVars
all_fvs) }

rnStmt _ _ (L _ ApplicativeStmt{}) _ =
  String
-> RnM
     (([(LStmt GhcRn (Located (body GhcRn)), FreeVars)], thing),
      FreeVars)
forall a. String -> a
panic "rnStmt: ApplicativeStmt"

rnStmt _ _ (L _ XStmtLR{}) _ =
  String
-> RnM
     (([(LStmt GhcRn (Located (body GhcRn)), FreeVars)], thing),
      FreeVars)
forall a. String -> a
panic "rnStmt: XStmtLR"

rnParallelStmts :: forall thing. HsStmtContext Name
                -> SyntaxExpr GhcRn
                -> [ParStmtBlock GhcPs GhcPs]
                -> ([Name] -> RnM (thing, FreeVars))
                -> RnM (([ParStmtBlock GhcRn GhcRn], thing), FreeVars)
-- Note [Renaming parallel Stmts]
rnParallelStmts :: HsStmtContext Name
-> SyntaxExpr GhcRn
-> [ParStmtBlock GhcPs GhcPs]
-> ([Name] -> RnM (thing, FreeVars))
-> RnM (([ParStmtBlock GhcRn GhcRn], thing), FreeVars)
rnParallelStmts ctxt :: HsStmtContext Name
ctxt return_op :: SyntaxExpr GhcRn
return_op segs :: [ParStmtBlock GhcPs GhcPs]
segs thing_inside :: [Name] -> RnM (thing, FreeVars)
thing_inside
  = do { LocalRdrEnv
orig_lcl_env <- RnM LocalRdrEnv
getLocalRdrEnv
       ; LocalRdrEnv
-> [Name]
-> [ParStmtBlock GhcPs GhcPs]
-> RnM (([ParStmtBlock GhcRn GhcRn], thing), FreeVars)
rn_segs LocalRdrEnv
orig_lcl_env [] [ParStmtBlock GhcPs GhcPs]
segs }
  where
    rn_segs :: LocalRdrEnv
            -> [Name] -> [ParStmtBlock GhcPs GhcPs]
            -> RnM (([ParStmtBlock GhcRn GhcRn], thing), FreeVars)
    rn_segs :: LocalRdrEnv
-> [Name]
-> [ParStmtBlock GhcPs GhcPs]
-> RnM (([ParStmtBlock GhcRn GhcRn], thing), FreeVars)
rn_segs _ bndrs_so_far :: [Name]
bndrs_so_far []
      = do { let (bndrs' :: [Name]
bndrs', dups :: [NonEmpty Name]
dups) = (Name -> Name -> Ordering) -> [Name] -> ([Name], [NonEmpty Name])
forall a. (a -> a -> Ordering) -> [a] -> ([a], [NonEmpty a])
removeDups Name -> Name -> Ordering
cmpByOcc [Name]
bndrs_so_far
           ; (NonEmpty Name -> IOEnv (Env TcGblEnv TcLclEnv) ())
-> [NonEmpty Name] -> IOEnv (Env TcGblEnv TcLclEnv) ()
forall (t :: * -> *) (m :: * -> *) a b.
(Foldable t, Monad m) =>
(a -> m b) -> t a -> m ()
mapM_ NonEmpty Name -> IOEnv (Env TcGblEnv TcLclEnv) ()
forall a.
Outputable a =>
NonEmpty a -> IOEnv (Env TcGblEnv TcLclEnv) ()
dupErr [NonEmpty Name]
dups
           ; (thing :: thing
thing, fvs :: FreeVars
fvs) <- [Name] -> RnM (thing, FreeVars) -> RnM (thing, FreeVars)
forall a. [Name] -> RnM a -> RnM a
bindLocalNames [Name]
bndrs' ([Name] -> RnM (thing, FreeVars)
thing_inside [Name]
bndrs')
           ; (([ParStmtBlock GhcRn GhcRn], thing), FreeVars)
-> RnM (([ParStmtBlock GhcRn GhcRn], thing), FreeVars)
forall (m :: * -> *) a. Monad m => a -> m a
return (([], thing
thing), FreeVars
fvs) }

    rn_segs env :: LocalRdrEnv
env bndrs_so_far :: [Name]
bndrs_so_far (ParStmtBlock x :: XParStmtBlock GhcPs GhcPs
x stmts :: [ExprLStmt GhcPs]
stmts _ _ : segs :: [ParStmtBlock GhcPs GhcPs]
segs)
      = do { ((stmts' :: [LStmt GhcRn (LHsExpr GhcRn)]
stmts', (used_bndrs :: [Name]
used_bndrs, segs' :: [ParStmtBlock GhcRn GhcRn]
segs', thing :: thing
thing)), fvs :: FreeVars
fvs)
                    <- HsStmtContext Name
-> (LHsExpr GhcPs -> RnM (LHsExpr GhcRn, FreeVars))
-> [ExprLStmt GhcPs]
-> ([Name]
    -> RnM (([Name], [ParStmtBlock GhcRn GhcRn], thing), FreeVars))
-> RnM
     (([LStmt GhcRn (LHsExpr GhcRn)],
       ([Name], [ParStmtBlock GhcRn GhcRn], thing)),
      FreeVars)
forall (body :: * -> *) thing.
Outputable (body GhcPs) =>
HsStmtContext Name
-> (Located (body GhcPs) -> RnM (Located (body GhcRn), FreeVars))
-> [LStmt GhcPs (Located (body GhcPs))]
-> ([Name] -> RnM (thing, FreeVars))
-> RnM (([LStmt GhcRn (Located (body GhcRn))], thing), FreeVars)
rnStmts HsStmtContext Name
ctxt LHsExpr GhcPs -> RnM (LHsExpr GhcRn, FreeVars)
rnLExpr [ExprLStmt GhcPs]
stmts (([Name]
  -> RnM (([Name], [ParStmtBlock GhcRn GhcRn], thing), FreeVars))
 -> RnM
      (([LStmt GhcRn (LHsExpr GhcRn)],
        ([Name], [ParStmtBlock GhcRn GhcRn], thing)),
       FreeVars))
-> ([Name]
    -> RnM (([Name], [ParStmtBlock GhcRn GhcRn], thing), FreeVars))
-> RnM
     (([LStmt GhcRn (LHsExpr GhcRn)],
       ([Name], [ParStmtBlock GhcRn GhcRn], thing)),
      FreeVars)
forall a b. (a -> b) -> a -> b
$ \ bndrs :: [Name]
bndrs ->
                       LocalRdrEnv
-> RnM (([Name], [ParStmtBlock GhcRn GhcRn], thing), FreeVars)
-> RnM (([Name], [ParStmtBlock GhcRn GhcRn], thing), FreeVars)
forall a. LocalRdrEnv -> RnM a -> RnM a
setLocalRdrEnv LocalRdrEnv
env       (RnM (([Name], [ParStmtBlock GhcRn GhcRn], thing), FreeVars)
 -> RnM (([Name], [ParStmtBlock GhcRn GhcRn], thing), FreeVars))
-> RnM (([Name], [ParStmtBlock GhcRn GhcRn], thing), FreeVars)
-> RnM (([Name], [ParStmtBlock GhcRn GhcRn], thing), FreeVars)
forall a b. (a -> b) -> a -> b
$ do
                       { ((segs' :: [ParStmtBlock GhcRn GhcRn]
segs', thing :: thing
thing), fvs :: FreeVars
fvs) <- LocalRdrEnv
-> [Name]
-> [ParStmtBlock GhcPs GhcPs]
-> RnM (([ParStmtBlock GhcRn GhcRn], thing), FreeVars)
rn_segs LocalRdrEnv
env ([Name]
bndrs [Name] -> [Name] -> [Name]
forall a. [a] -> [a] -> [a]
++ [Name]
bndrs_so_far) [ParStmtBlock GhcPs GhcPs]
segs
                       ; let used_bndrs :: [Name]
used_bndrs = (Name -> Bool) -> [Name] -> [Name]
forall a. (a -> Bool) -> [a] -> [a]
filter (Name -> FreeVars -> Bool
`elemNameSet` FreeVars
fvs) [Name]
bndrs
                       ; (([Name], [ParStmtBlock GhcRn GhcRn], thing), FreeVars)
-> RnM (([Name], [ParStmtBlock GhcRn GhcRn], thing), FreeVars)
forall (m :: * -> *) a. Monad m => a -> m a
return (([Name]
used_bndrs, [ParStmtBlock GhcRn GhcRn]
segs', thing
thing), FreeVars
fvs) }

           ; let seg' :: ParStmtBlock GhcRn GhcRn
seg' = XParStmtBlock GhcRn GhcRn
-> [LStmt GhcRn (LHsExpr GhcRn)]
-> [IdP GhcRn]
-> SyntaxExpr GhcRn
-> ParStmtBlock GhcRn GhcRn
forall idL idR.
XParStmtBlock idL idR
-> [ExprLStmt idL]
-> [IdP idR]
-> SyntaxExpr idR
-> ParStmtBlock idL idR
ParStmtBlock XParStmtBlock GhcPs GhcPs
XParStmtBlock GhcRn GhcRn
x [LStmt GhcRn (LHsExpr GhcRn)]
stmts' [Name]
[IdP GhcRn]
used_bndrs SyntaxExpr GhcRn
return_op
           ; (([ParStmtBlock GhcRn GhcRn], thing), FreeVars)
-> RnM (([ParStmtBlock GhcRn GhcRn], thing), FreeVars)
forall (m :: * -> *) a. Monad m => a -> m a
return ((ParStmtBlock GhcRn GhcRn
seg'ParStmtBlock GhcRn GhcRn
-> [ParStmtBlock GhcRn GhcRn] -> [ParStmtBlock GhcRn GhcRn]
forall a. a -> [a] -> [a]
:[ParStmtBlock GhcRn GhcRn]
segs', thing
thing), FreeVars
fvs) }
    rn_segs _ _ (XParStmtBlock{}:_) = String -> RnM (([ParStmtBlock GhcRn GhcRn], thing), FreeVars)
forall a. String -> a
panic "rnParallelStmts"

    cmpByOcc :: Name -> Name -> Ordering
cmpByOcc n1 :: Name
n1 n2 :: Name
n2 = Name -> OccName
nameOccName Name
n1 OccName -> OccName -> Ordering
forall a. Ord a => a -> a -> Ordering
`compare` Name -> OccName
nameOccName Name
n2
    dupErr :: NonEmpty a -> IOEnv (Env TcGblEnv TcLclEnv) ()
dupErr vs :: NonEmpty a
vs = MsgDoc -> IOEnv (Env TcGblEnv TcLclEnv) ()
addErr (String -> MsgDoc
text "Duplicate binding in parallel list comprehension for:"
                    MsgDoc -> MsgDoc -> MsgDoc
<+> MsgDoc -> MsgDoc
quotes (a -> MsgDoc
forall a. Outputable a => a -> MsgDoc
ppr (NonEmpty a -> a
forall a. NonEmpty a -> a
NE.head NonEmpty a
vs)))

lookupStmtName :: HsStmtContext Name -> Name -> RnM (SyntaxExpr GhcRn, FreeVars)
-- Like lookupSyntaxName, but respects contexts
lookupStmtName :: HsStmtContext Name -> Name -> RnM (SyntaxExpr GhcRn, FreeVars)
lookupStmtName ctxt :: HsStmtContext Name
ctxt n :: Name
n
  | HsStmtContext Name -> Bool
rebindableContext HsStmtContext Name
ctxt
  = Name -> RnM (SyntaxExpr GhcRn, FreeVars)
lookupSyntaxName Name
n
  | Bool
otherwise
  = (SyntaxExpr GhcRn, FreeVars) -> RnM (SyntaxExpr GhcRn, FreeVars)
forall (m :: * -> *) a. Monad m => a -> m a
return (Name -> SyntaxExpr GhcRn
mkRnSyntaxExpr Name
n, FreeVars
emptyFVs)

lookupStmtNamePoly :: HsStmtContext Name -> Name -> RnM (HsExpr GhcRn, FreeVars)
lookupStmtNamePoly :: HsStmtContext Name -> Name -> RnM (HsExpr GhcRn, FreeVars)
lookupStmtNamePoly ctxt :: HsStmtContext Name
ctxt name :: Name
name
  | HsStmtContext Name -> Bool
rebindableContext HsStmtContext Name
ctxt
  = do { Bool
rebindable_on <- Extension -> TcRnIf TcGblEnv TcLclEnv Bool
forall gbl lcl. Extension -> TcRnIf gbl lcl Bool
xoptM Extension
LangExt.RebindableSyntax
       ; if Bool
rebindable_on
         then do { Name
fm <- RdrName -> RnM Name
lookupOccRn (Name -> RdrName
nameRdrName Name
name)
                 ; (HsExpr GhcRn, FreeVars) -> RnM (HsExpr GhcRn, FreeVars)
forall (m :: * -> *) a. Monad m => a -> m a
return (XVar GhcRn -> Located (IdP GhcRn) -> HsExpr GhcRn
forall p. XVar p -> Located (IdP p) -> HsExpr p
HsVar XVar GhcRn
NoExt
noExt (SrcSpanLess (Located Name) -> Located Name
forall a. HasSrcSpan a => SrcSpanLess a -> a
noLoc Name
SrcSpanLess (Located Name)
fm), Name -> FreeVars
unitFV Name
fm) }
         else RnM (HsExpr GhcRn, FreeVars)
not_rebindable }
  | Bool
otherwise
  = RnM (HsExpr GhcRn, FreeVars)
not_rebindable
  where
    not_rebindable :: RnM (HsExpr GhcRn, FreeVars)
not_rebindable = (HsExpr GhcRn, FreeVars) -> RnM (HsExpr GhcRn, FreeVars)
forall (m :: * -> *) a. Monad m => a -> m a
return (XVar GhcRn -> Located (IdP GhcRn) -> HsExpr GhcRn
forall p. XVar p -> Located (IdP p) -> HsExpr p
HsVar XVar GhcRn
NoExt
noExt (SrcSpanLess (Located Name) -> Located Name
forall a. HasSrcSpan a => SrcSpanLess a -> a
noLoc Name
SrcSpanLess (Located Name)
name), FreeVars
emptyFVs)

-- | Is this a context where we respect RebindableSyntax?
-- but ListComp are never rebindable
-- Neither is ArrowExpr, which has its own desugarer in DsArrows
rebindableContext :: HsStmtContext Name -> Bool
rebindableContext :: HsStmtContext Name -> Bool
rebindableContext ctxt :: HsStmtContext Name
ctxt = case HsStmtContext Name
ctxt of
  ListComp        -> Bool
False
  ArrowExpr       -> Bool
False
  PatGuard {}     -> Bool
False

  DoExpr          -> Bool
True
  MDoExpr         -> Bool
True
  MonadComp       -> Bool
True
  GhciStmtCtxt    -> Bool
True   -- I suppose?

  ParStmtCtxt   c :: HsStmtContext Name
c -> HsStmtContext Name -> Bool
rebindableContext HsStmtContext Name
c     -- Look inside to
  TransStmtCtxt c :: HsStmtContext Name
c -> HsStmtContext Name -> Bool
rebindableContext HsStmtContext Name
c     -- the parent context

{-
Note [Renaming parallel Stmts]
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Renaming parallel statements is painful.  Given, say
     [ a+c | a <- as, bs <- bss
           | c <- bs, a <- ds ]
Note that
  (a) In order to report "Defined but not used" about 'bs', we must
      rename each group of Stmts with a thing_inside whose FreeVars
      include at least {a,c}

  (b) We want to report that 'a' is illegally bound in both branches

  (c) The 'bs' in the second group must obviously not be captured by
      the binding in the first group

To satisfy (a) we nest the segements.
To satisfy (b) we check for duplicates just before thing_inside.
To satisfy (c) we reset the LocalRdrEnv each time.

************************************************************************
*                                                                      *
\subsubsection{mdo expressions}
*                                                                      *
************************************************************************
-}

type FwdRefs = NameSet
type Segment stmts = (Defs,
                      Uses,     -- May include defs
                      FwdRefs,  -- A subset of uses that are
                                --   (a) used before they are bound in this segment, or
                                --   (b) used here, and bound in subsequent segments
                      stmts)    -- Either Stmt or [Stmt]


-- wrapper that does both the left- and right-hand sides
rnRecStmtsAndThen :: Outputable (body GhcPs) =>
                     (Located (body GhcPs)
                  -> RnM (Located (body GhcRn), FreeVars))
                  -> [LStmt GhcPs (Located (body GhcPs))]
                         -- assumes that the FreeVars returned includes
                         -- the FreeVars of the Segments
                  -> ([Segment (LStmt GhcRn (Located (body GhcRn)))]
                      -> RnM (a, FreeVars))
                  -> RnM (a, FreeVars)
rnRecStmtsAndThen :: (Located (body GhcPs) -> RnM (Located (body GhcRn), FreeVars))
-> [LStmt GhcPs (Located (body GhcPs))]
-> ([Segment (LStmt GhcRn (Located (body GhcRn)))]
    -> RnM (a, FreeVars))
-> RnM (a, FreeVars)
rnRecStmtsAndThen rnBody :: Located (body GhcPs) -> RnM (Located (body GhcRn), FreeVars)
rnBody s :: [LStmt GhcPs (Located (body GhcPs))]
s cont :: [Segment (LStmt GhcRn (Located (body GhcRn)))] -> RnM (a, FreeVars)
cont
  = do  { -- (A) Make the mini fixity env for all of the stmts
          MiniFixityEnv
fix_env <- [LFixitySig GhcPs] -> RnM MiniFixityEnv
makeMiniFixityEnv ([LStmt GhcPs (Located (body GhcPs))] -> [LFixitySig GhcPs]
forall body. [LStmtLR GhcPs GhcPs body] -> [LFixitySig GhcPs]
collectRecStmtsFixities [LStmt GhcPs (Located (body GhcPs))]
s)

          -- (B) Do the LHSes
        ; [(LStmtLR GhcRn GhcPs (Located (body GhcPs)), FreeVars)]
new_lhs_and_fv <- MiniFixityEnv
-> [LStmt GhcPs (Located (body GhcPs))]
-> RnM [(LStmtLR GhcRn GhcPs (Located (body GhcPs)), FreeVars)]
forall body.
Outputable body =>
MiniFixityEnv
-> [LStmt GhcPs body] -> RnM [(LStmtLR GhcRn GhcPs body, FreeVars)]
rn_rec_stmts_lhs MiniFixityEnv
fix_env [LStmt GhcPs (Located (body GhcPs))]
s

          --    ...bring them and their fixities into scope
        ; let bound_names :: [IdP GhcRn]
bound_names = [LStmtLR GhcRn GhcPs (Located (body GhcPs))] -> [IdP GhcRn]
forall (idL :: Pass) (idR :: Pass) body.
[LStmtLR (GhcPass idL) (GhcPass idR) body] -> [IdP (GhcPass idL)]
collectLStmtsBinders (((LStmtLR GhcRn GhcPs (Located (body GhcPs)), FreeVars)
 -> LStmtLR GhcRn GhcPs (Located (body GhcPs)))
-> [(LStmtLR GhcRn GhcPs (Located (body GhcPs)), FreeVars)]
-> [LStmtLR GhcRn GhcPs (Located (body GhcPs))]
forall a b. (a -> b) -> [a] -> [b]
map (LStmtLR GhcRn GhcPs (Located (body GhcPs)), FreeVars)
-> LStmtLR GhcRn GhcPs (Located (body GhcPs))
forall a b. (a, b) -> a
fst [(LStmtLR GhcRn GhcPs (Located (body GhcPs)), FreeVars)]
new_lhs_and_fv)
              -- Fake uses of variables introduced implicitly (warning suppression, see #4404)
              implicit_uses :: FreeVars
implicit_uses = [LStmtLR GhcRn GhcPs (Located (body GhcPs))] -> FreeVars
forall (idR :: Pass) (body :: * -> *).
[LStmtLR GhcRn (GhcPass idR) (Located (body (GhcPass idR)))]
-> FreeVars
lStmtsImplicits (((LStmtLR GhcRn GhcPs (Located (body GhcPs)), FreeVars)
 -> LStmtLR GhcRn GhcPs (Located (body GhcPs)))
-> [(LStmtLR GhcRn GhcPs (Located (body GhcPs)), FreeVars)]
-> [LStmtLR GhcRn GhcPs (Located (body GhcPs))]
forall a b. (a -> b) -> [a] -> [b]
map (LStmtLR GhcRn GhcPs (Located (body GhcPs)), FreeVars)
-> LStmtLR GhcRn GhcPs (Located (body GhcPs))
forall a b. (a, b) -> a
fst [(LStmtLR GhcRn GhcPs (Located (body GhcPs)), FreeVars)]
new_lhs_and_fv)
        ; [Name] -> RnM (a, FreeVars) -> RnM (a, FreeVars)
forall a. [Name] -> RnM (a, FreeVars) -> RnM (a, FreeVars)
bindLocalNamesFV [Name]
[IdP GhcRn]
bound_names (RnM (a, FreeVars) -> RnM (a, FreeVars))
-> RnM (a, FreeVars) -> RnM (a, FreeVars)
forall a b. (a -> b) -> a -> b
$
          MiniFixityEnv -> [Name] -> RnM (a, FreeVars) -> RnM (a, FreeVars)
forall a. MiniFixityEnv -> [Name] -> RnM a -> RnM a
addLocalFixities MiniFixityEnv
fix_env [Name]
[IdP GhcRn]
bound_names (RnM (a, FreeVars) -> RnM (a, FreeVars))
-> RnM (a, FreeVars) -> RnM (a, FreeVars)
forall a b. (a -> b) -> a -> b
$ do

          -- (C) do the right-hand-sides and thing-inside
        { [Segment (LStmt GhcRn (Located (body GhcRn)))]
segs <- (Located (body GhcPs) -> RnM (Located (body GhcRn), FreeVars))
-> [Name]
-> [(LStmtLR GhcRn GhcPs (Located (body GhcPs)), FreeVars)]
-> RnM [Segment (LStmt GhcRn (Located (body GhcRn)))]
forall (body :: * -> *).
Outputable (body GhcPs) =>
(Located (body GhcPs) -> RnM (Located (body GhcRn), FreeVars))
-> [Name]
-> [(LStmtLR GhcRn GhcPs (Located (body GhcPs)), FreeVars)]
-> RnM [Segment (LStmt GhcRn (Located (body GhcRn)))]
rn_rec_stmts Located (body GhcPs) -> RnM (Located (body GhcRn), FreeVars)
rnBody [Name]
[IdP GhcRn]
bound_names [(LStmtLR GhcRn GhcPs (Located (body GhcPs)), FreeVars)]
new_lhs_and_fv
        ; (res :: a
res, fvs :: FreeVars
fvs) <- [Segment (LStmt GhcRn (Located (body GhcRn)))] -> RnM (a, FreeVars)
cont [Segment (LStmt GhcRn (Located (body GhcRn)))]
segs
        ; [Name] -> FreeVars -> IOEnv (Env TcGblEnv TcLclEnv) ()
warnUnusedLocalBinds [Name]
[IdP GhcRn]
bound_names (FreeVars
fvs FreeVars -> FreeVars -> FreeVars
`unionNameSet` FreeVars
implicit_uses)
        ; (a, FreeVars) -> RnM (a, FreeVars)
forall (m :: * -> *) a. Monad m => a -> m a
return (a
res, FreeVars
fvs) }}

-- get all the fixity decls in any Let stmt
collectRecStmtsFixities :: [LStmtLR GhcPs GhcPs body] -> [LFixitySig GhcPs]
collectRecStmtsFixities :: [LStmtLR GhcPs GhcPs body] -> [LFixitySig GhcPs]
collectRecStmtsFixities l :: [LStmtLR GhcPs GhcPs body]
l =
    (LStmtLR GhcPs GhcPs body
 -> [LFixitySig GhcPs] -> [LFixitySig GhcPs])
-> [LFixitySig GhcPs]
-> [LStmtLR GhcPs GhcPs body]
-> [LFixitySig GhcPs]
forall (t :: * -> *) a b.
Foldable t =>
(a -> b -> b) -> b -> t a -> b
foldr (\ s :: LStmtLR GhcPs GhcPs body
s -> \acc :: [LFixitySig GhcPs]
acc -> case LStmtLR GhcPs GhcPs body
s of
            (L _ (LetStmt _ (L _ (HsValBinds _ (ValBinds _ _ sigs :: [LSig GhcPs]
sigs))))) ->
              (LSig GhcPs -> [LFixitySig GhcPs] -> [LFixitySig GhcPs])
-> [LFixitySig GhcPs] -> [LSig GhcPs] -> [LFixitySig GhcPs]
forall (t :: * -> *) a b.
Foldable t =>
(a -> b -> b) -> b -> t a -> b
foldr (\ sig :: LSig GhcPs
sig -> \ acc :: [LFixitySig GhcPs]
acc -> case LSig GhcPs
sig of
                                         (L loc :: SrcSpan
loc (FixSig _ s :: FixitySig GhcPs
s)) -> (SrcSpan -> FixitySig GhcPs -> LFixitySig GhcPs
forall l e. l -> e -> GenLocated l e
L SrcSpan
loc FixitySig GhcPs
s) LFixitySig GhcPs -> [LFixitySig GhcPs] -> [LFixitySig GhcPs]
forall a. a -> [a] -> [a]
: [LFixitySig GhcPs]
acc
                                         _ -> [LFixitySig GhcPs]
acc) [LFixitySig GhcPs]
acc [LSig GhcPs]
sigs
            _ -> [LFixitySig GhcPs]
acc) [] [LStmtLR GhcPs GhcPs body]
l

-- left-hand sides

rn_rec_stmt_lhs :: Outputable body => MiniFixityEnv
                -> LStmt GhcPs body
                   -- rename LHS, and return its FVs
                   -- Warning: we will only need the FreeVars below in the case of a BindStmt,
                   -- so we don't bother to compute it accurately in the other cases
                -> RnM [(LStmtLR GhcRn GhcPs body, FreeVars)]

rn_rec_stmt_lhs :: MiniFixityEnv
-> LStmt GhcPs body -> RnM [(LStmtLR GhcRn GhcPs body, FreeVars)]
rn_rec_stmt_lhs _ (L loc :: SrcSpan
loc (BodyStmt _ body :: body
body a :: SyntaxExpr GhcPs
a b :: SyntaxExpr GhcPs
b))
  = [(LStmtLR GhcRn GhcPs body, FreeVars)]
-> RnM [(LStmtLR GhcRn GhcPs body, FreeVars)]
forall (m :: * -> *) a. Monad m => a -> m a
return [(SrcSpan -> StmtLR GhcRn GhcPs body -> LStmtLR GhcRn GhcPs body
forall l e. l -> e -> GenLocated l e
L SrcSpan
loc (XBodyStmt GhcRn GhcPs body
-> body
-> SyntaxExpr GhcPs
-> SyntaxExpr GhcPs
-> StmtLR GhcRn GhcPs body
forall idL idR body.
XBodyStmt idL idR body
-> body -> SyntaxExpr idR -> SyntaxExpr idR -> StmtLR idL idR body
BodyStmt XBodyStmt GhcRn GhcPs body
NoExt
noExt body
body SyntaxExpr GhcPs
a SyntaxExpr GhcPs
b), FreeVars
emptyFVs)]

rn_rec_stmt_lhs _ (L loc :: SrcSpan
loc (LastStmt _ body :: body
body noret :: Bool
noret a :: SyntaxExpr GhcPs
a))
  = [(LStmtLR GhcRn GhcPs body, FreeVars)]
-> RnM [(LStmtLR GhcRn GhcPs body, FreeVars)]
forall (m :: * -> *) a. Monad m => a -> m a
return [(SrcSpan -> StmtLR GhcRn GhcPs body -> LStmtLR GhcRn GhcPs body
forall l e. l -> e -> GenLocated l e
L SrcSpan
loc (XLastStmt GhcRn GhcPs body
-> body -> Bool -> SyntaxExpr GhcPs -> StmtLR GhcRn GhcPs body
forall idL idR body.
XLastStmt idL idR body
-> body -> Bool -> SyntaxExpr idR -> StmtLR idL idR body
LastStmt XLastStmt GhcRn GhcPs body
NoExt
noExt body
body Bool
noret SyntaxExpr GhcPs
a), FreeVars
emptyFVs)]

rn_rec_stmt_lhs fix_env :: MiniFixityEnv
fix_env (L loc :: SrcSpan
loc (BindStmt _ pat :: LPat GhcPs
pat body :: body
body a :: SyntaxExpr GhcPs
a b :: SyntaxExpr GhcPs
b))
  = do
      -- should the ctxt be MDo instead?
      (pat' :: LPat GhcRn
pat', fv_pat :: FreeVars
fv_pat) <- NameMaker -> LPat GhcPs -> RnM (LPat GhcRn, FreeVars)
rnBindPat (MiniFixityEnv -> NameMaker
localRecNameMaker MiniFixityEnv
fix_env) LPat GhcPs
pat
      [(LStmtLR GhcRn GhcPs body, FreeVars)]
-> RnM [(LStmtLR GhcRn GhcPs body, FreeVars)]
forall (m :: * -> *) a. Monad m => a -> m a
return [(SrcSpan -> StmtLR GhcRn GhcPs body -> LStmtLR GhcRn GhcPs body
forall l e. l -> e -> GenLocated l e
L SrcSpan
loc (XBindStmt GhcRn GhcPs body
-> LPat GhcRn
-> body
-> SyntaxExpr GhcPs
-> SyntaxExpr GhcPs
-> StmtLR GhcRn GhcPs body
forall idL idR body.
XBindStmt idL idR body
-> LPat idL
-> body
-> SyntaxExpr idR
-> SyntaxExpr idR
-> StmtLR idL idR body
BindStmt XBindStmt GhcRn GhcPs body
NoExt
noExt LPat GhcRn
pat' body
body SyntaxExpr GhcPs
a SyntaxExpr GhcPs
b), FreeVars
fv_pat)]

rn_rec_stmt_lhs _ (L _ (LetStmt _ (L _ binds :: HsLocalBinds GhcPs
binds@(HsIPBinds {}))))
  = MsgDoc -> RnM [(LStmtLR GhcRn GhcPs body, FreeVars)]
forall a. MsgDoc -> TcRn a
failWith (MsgDoc -> HsLocalBinds GhcPs -> MsgDoc
forall a. Outputable a => MsgDoc -> a -> MsgDoc
badIpBinds (String -> MsgDoc
text "an mdo expression") HsLocalBinds GhcPs
binds)

rn_rec_stmt_lhs fix_env :: MiniFixityEnv
fix_env (L loc :: SrcSpan
loc (LetStmt _ (L l :: SrcSpan
l (HsValBinds x :: XHsValBinds GhcPs GhcPs
x binds :: HsValBindsLR GhcPs GhcPs
binds))))
    = do (_bound_names :: [Name]
_bound_names, binds' :: HsValBindsLR GhcRn GhcPs
binds') <- MiniFixityEnv
-> HsValBindsLR GhcPs GhcPs
-> RnM ([Name], HsValBindsLR GhcRn GhcPs)
rnLocalValBindsLHS MiniFixityEnv
fix_env HsValBindsLR GhcPs GhcPs
binds
         [(LStmtLR GhcRn GhcPs body, FreeVars)]
-> RnM [(LStmtLR GhcRn GhcPs body, FreeVars)]
forall (m :: * -> *) a. Monad m => a -> m a
return [(SrcSpan -> StmtLR GhcRn GhcPs body -> LStmtLR GhcRn GhcPs body
forall l e. l -> e -> GenLocated l e
L SrcSpan
loc (XLetStmt GhcRn GhcPs body
-> LHsLocalBindsLR GhcRn GhcPs -> StmtLR GhcRn GhcPs body
forall idL idR body.
XLetStmt idL idR body
-> LHsLocalBindsLR idL idR -> StmtLR idL idR body
LetStmt XLetStmt GhcRn GhcPs body
NoExt
noExt (SrcSpan
-> HsLocalBindsLR GhcRn GhcPs -> LHsLocalBindsLR GhcRn GhcPs
forall l e. l -> e -> GenLocated l e
L SrcSpan
l (XHsValBinds GhcRn GhcPs
-> HsValBindsLR GhcRn GhcPs -> HsLocalBindsLR GhcRn GhcPs
forall idL idR.
XHsValBinds idL idR
-> HsValBindsLR idL idR -> HsLocalBindsLR idL idR
HsValBinds XHsValBinds GhcPs GhcPs
XHsValBinds GhcRn GhcPs
x HsValBindsLR GhcRn GhcPs
binds'))),
                 -- Warning: this is bogus; see function invariant
                 FreeVars
emptyFVs
                 )]

-- XXX Do we need to do something with the return and mfix names?
rn_rec_stmt_lhs fix_env :: MiniFixityEnv
fix_env (L _ (RecStmt { recS_stmts :: forall idL idR body. StmtLR idL idR body -> [LStmtLR idL idR body]
recS_stmts = [LStmt GhcPs body]
stmts }))  -- Flatten Rec inside Rec
    = MiniFixityEnv
-> [LStmt GhcPs body] -> RnM [(LStmtLR GhcRn GhcPs body, FreeVars)]
forall body.
Outputable body =>
MiniFixityEnv
-> [LStmt GhcPs body] -> RnM [(LStmtLR GhcRn GhcPs body, FreeVars)]
rn_rec_stmts_lhs MiniFixityEnv
fix_env [LStmt GhcPs body]
stmts

rn_rec_stmt_lhs _ stmt :: LStmt GhcPs body
stmt@(L _ (ParStmt {}))       -- Syntactically illegal in mdo
  = String -> MsgDoc -> RnM [(LStmtLR GhcRn GhcPs body, FreeVars)]
forall a. HasCallStack => String -> MsgDoc -> a
pprPanic "rn_rec_stmt" (LStmt GhcPs body -> MsgDoc
forall a. Outputable a => a -> MsgDoc
ppr LStmt GhcPs body
stmt)

rn_rec_stmt_lhs _ stmt :: LStmt GhcPs body
stmt@(L _ (TransStmt {}))     -- Syntactically illegal in mdo
  = String -> MsgDoc -> RnM [(LStmtLR GhcRn GhcPs body, FreeVars)]
forall a. HasCallStack => String -> MsgDoc -> a
pprPanic "rn_rec_stmt" (LStmt GhcPs body -> MsgDoc
forall a. Outputable a => a -> MsgDoc
ppr LStmt GhcPs body
stmt)

rn_rec_stmt_lhs _ stmt :: LStmt GhcPs body
stmt@(L _ (ApplicativeStmt {})) -- Shouldn't appear yet
  = String -> MsgDoc -> RnM [(LStmtLR GhcRn GhcPs body, FreeVars)]
forall a. HasCallStack => String -> MsgDoc -> a
pprPanic "rn_rec_stmt" (LStmt GhcPs body -> MsgDoc
forall a. Outputable a => a -> MsgDoc
ppr LStmt GhcPs body
stmt)

rn_rec_stmt_lhs _ (L _ (LetStmt _ (L _ (EmptyLocalBinds _))))
  = String -> RnM [(LStmtLR GhcRn GhcPs body, FreeVars)]
forall a. String -> a
panic "rn_rec_stmt LetStmt EmptyLocalBinds"
rn_rec_stmt_lhs _ (L _ (LetStmt _ (L _ (XHsLocalBindsLR _))))
  = String -> RnM [(LStmtLR GhcRn GhcPs body, FreeVars)]
forall a. String -> a
panic "rn_rec_stmt LetStmt XHsLocalBindsLR"
rn_rec_stmt_lhs _ (L _ (XStmtLR _))
  = String -> RnM [(LStmtLR GhcRn GhcPs body, FreeVars)]
forall a. String -> a
panic "rn_rec_stmt XStmtLR"

rn_rec_stmts_lhs :: Outputable body => MiniFixityEnv
                 -> [LStmt GhcPs body]
                 -> RnM [(LStmtLR GhcRn GhcPs body, FreeVars)]
rn_rec_stmts_lhs :: MiniFixityEnv
-> [LStmt GhcPs body] -> RnM [(LStmtLR GhcRn GhcPs body, FreeVars)]
rn_rec_stmts_lhs fix_env :: MiniFixityEnv
fix_env stmts :: [LStmt GhcPs body]
stmts
  = do { [(LStmtLR GhcRn GhcPs body, FreeVars)]
ls <- (LStmt GhcPs body -> RnM [(LStmtLR GhcRn GhcPs body, FreeVars)])
-> [LStmt GhcPs body] -> RnM [(LStmtLR GhcRn GhcPs body, FreeVars)]
forall (m :: * -> *) a b. Monad m => (a -> m [b]) -> [a] -> m [b]
concatMapM (MiniFixityEnv
-> LStmt GhcPs body -> RnM [(LStmtLR GhcRn GhcPs body, FreeVars)]
forall body.
Outputable body =>
MiniFixityEnv
-> LStmt GhcPs body -> RnM [(LStmtLR GhcRn GhcPs body, FreeVars)]
rn_rec_stmt_lhs MiniFixityEnv
fix_env) [LStmt GhcPs body]
stmts
       ; let boundNames :: [IdP GhcRn]
boundNames = [LStmtLR GhcRn GhcPs body] -> [IdP GhcRn]
forall (idL :: Pass) (idR :: Pass) body.
[LStmtLR (GhcPass idL) (GhcPass idR) body] -> [IdP (GhcPass idL)]
collectLStmtsBinders (((LStmtLR GhcRn GhcPs body, FreeVars) -> LStmtLR GhcRn GhcPs body)
-> [(LStmtLR GhcRn GhcPs body, FreeVars)]
-> [LStmtLR GhcRn GhcPs body]
forall a b. (a -> b) -> [a] -> [b]
map (LStmtLR GhcRn GhcPs body, FreeVars) -> LStmtLR GhcRn GhcPs body
forall a b. (a, b) -> a
fst [(LStmtLR GhcRn GhcPs body, FreeVars)]
ls)
            -- First do error checking: we need to check for dups here because we
            -- don't bind all of the variables from the Stmt at once
            -- with bindLocatedLocals.
       ; [Name] -> IOEnv (Env TcGblEnv TcLclEnv) ()
checkDupNames [Name]
[IdP GhcRn]
boundNames
       ; [(LStmtLR GhcRn GhcPs body, FreeVars)]
-> RnM [(LStmtLR GhcRn GhcPs body, FreeVars)]
forall (m :: * -> *) a. Monad m => a -> m a
return [(LStmtLR GhcRn GhcPs body, FreeVars)]
ls }


-- right-hand-sides

rn_rec_stmt :: (Outputable (body GhcPs)) =>
               (Located (body GhcPs) -> RnM (Located (body GhcRn), FreeVars))
            -> [Name]
            -> (LStmtLR GhcRn GhcPs (Located (body GhcPs)), FreeVars)
            -> RnM [Segment (LStmt GhcRn (Located (body GhcRn)))]
        -- Rename a Stmt that is inside a RecStmt (or mdo)
        -- Assumes all binders are already in scope
        -- Turns each stmt into a singleton Stmt
rn_rec_stmt :: (Located (body GhcPs) -> RnM (Located (body GhcRn), FreeVars))
-> [Name]
-> (LStmtLR GhcRn GhcPs (Located (body GhcPs)), FreeVars)
-> RnM [Segment (LStmt GhcRn (Located (body GhcRn)))]
rn_rec_stmt rnBody :: Located (body GhcPs) -> RnM (Located (body GhcRn), FreeVars)
rnBody _ (L loc :: SrcSpan
loc (LastStmt _ body :: Located (body GhcPs)
body noret :: Bool
noret _), _)
  = do  { (body' :: Located (body GhcRn)
body', fv_expr :: FreeVars
fv_expr) <- Located (body GhcPs) -> RnM (Located (body GhcRn), FreeVars)
rnBody Located (body GhcPs)
body
        ; (ret_op :: SyntaxExpr GhcRn
ret_op, fvs1 :: FreeVars
fvs1)   <- Name -> RnM (SyntaxExpr GhcRn, FreeVars)
lookupSyntaxName Name
returnMName
        ; [Segment (LStmt GhcRn (Located (body GhcRn)))]
-> RnM [Segment (LStmt GhcRn (Located (body GhcRn)))]
forall (m :: * -> *) a. Monad m => a -> m a
return [(FreeVars
emptyNameSet, FreeVars
fv_expr FreeVars -> FreeVars -> FreeVars
`plusFV` FreeVars
fvs1, FreeVars
emptyNameSet,
                   SrcSpan
-> StmtLR GhcRn GhcRn (Located (body GhcRn))
-> LStmt GhcRn (Located (body GhcRn))
forall l e. l -> e -> GenLocated l e
L SrcSpan
loc (XLastStmt GhcRn GhcRn (Located (body GhcRn))
-> Located (body GhcRn)
-> Bool
-> SyntaxExpr GhcRn
-> StmtLR GhcRn GhcRn (Located (body GhcRn))
forall idL idR body.
XLastStmt idL idR body
-> body -> Bool -> SyntaxExpr idR -> StmtLR idL idR body
LastStmt XLastStmt GhcRn GhcRn (Located (body GhcRn))
NoExt
noExt Located (body GhcRn)
body' Bool
noret SyntaxExpr GhcRn
ret_op))] }

rn_rec_stmt rnBody :: Located (body GhcPs) -> RnM (Located (body GhcRn), FreeVars)
rnBody _ (L loc :: SrcSpan
loc (BodyStmt _ body :: Located (body GhcPs)
body _ _), _)
  = do { (body' :: Located (body GhcRn)
body', fvs :: FreeVars
fvs) <- Located (body GhcPs) -> RnM (Located (body GhcRn), FreeVars)
rnBody Located (body GhcPs)
body
       ; (then_op :: SyntaxExpr GhcRn
then_op, fvs1 :: FreeVars
fvs1) <- Name -> RnM (SyntaxExpr GhcRn, FreeVars)
lookupSyntaxName Name
thenMName
       ; [Segment (LStmt GhcRn (Located (body GhcRn)))]
-> RnM [Segment (LStmt GhcRn (Located (body GhcRn)))]
forall (m :: * -> *) a. Monad m => a -> m a
return [(FreeVars
emptyNameSet, FreeVars
fvs FreeVars -> FreeVars -> FreeVars
`plusFV` FreeVars
fvs1, FreeVars
emptyNameSet,
                 SrcSpan
-> StmtLR GhcRn GhcRn (Located (body GhcRn))
-> LStmt GhcRn (Located (body GhcRn))
forall l e. l -> e -> GenLocated l e
L SrcSpan
loc (XBodyStmt GhcRn GhcRn (Located (body GhcRn))
-> Located (body GhcRn)
-> SyntaxExpr GhcRn
-> SyntaxExpr GhcRn
-> StmtLR GhcRn GhcRn (Located (body GhcRn))
forall idL idR body.
XBodyStmt idL idR body
-> body -> SyntaxExpr idR -> SyntaxExpr idR -> StmtLR idL idR body
BodyStmt XBodyStmt GhcRn GhcRn (Located (body GhcRn))
NoExt
noExt Located (body GhcRn)
body' SyntaxExpr GhcRn
then_op SyntaxExpr GhcRn
forall (p :: Pass). SyntaxExpr (GhcPass p)
noSyntaxExpr))] }

rn_rec_stmt rnBody :: Located (body GhcPs) -> RnM (Located (body GhcRn), FreeVars)
rnBody _ (L loc :: SrcSpan
loc (BindStmt _ pat' :: LPat GhcRn
pat' body :: Located (body GhcPs)
body _ _), fv_pat :: FreeVars
fv_pat)
  = do { (body' :: Located (body GhcRn)
body', fv_expr :: FreeVars
fv_expr) <- Located (body GhcPs) -> RnM (Located (body GhcRn), FreeVars)
rnBody Located (body GhcPs)
body
       ; (bind_op :: SyntaxExpr GhcRn
bind_op, fvs1 :: FreeVars
fvs1) <- Name -> RnM (SyntaxExpr GhcRn, FreeVars)
lookupSyntaxName Name
bindMName

       ; (fail_op :: SyntaxExpr GhcRn
fail_op, fvs2 :: FreeVars
fvs2) <- RnM (SyntaxExpr GhcRn, FreeVars)
getMonadFailOp

       ; let bndrs :: FreeVars
bndrs = [Name] -> FreeVars
mkNameSet (LPat GhcRn -> [IdP GhcRn]
forall (p :: Pass). LPat (GhcPass p) -> [IdP (GhcPass p)]
collectPatBinders LPat GhcRn
pat')
             fvs :: FreeVars
fvs   = FreeVars
fv_expr FreeVars -> FreeVars -> FreeVars
`plusFV` FreeVars
fv_pat FreeVars -> FreeVars -> FreeVars
`plusFV` FreeVars
fvs1 FreeVars -> FreeVars -> FreeVars
`plusFV` FreeVars
fvs2
       ; [Segment (LStmt GhcRn (Located (body GhcRn)))]
-> RnM [Segment (LStmt GhcRn (Located (body GhcRn)))]
forall (m :: * -> *) a. Monad m => a -> m a
return [(FreeVars
bndrs, FreeVars
fvs, FreeVars
bndrs FreeVars -> FreeVars -> FreeVars
`intersectNameSet` FreeVars
fvs,
                  SrcSpan
-> StmtLR GhcRn GhcRn (Located (body GhcRn))
-> LStmt GhcRn (Located (body GhcRn))
forall l e. l -> e -> GenLocated l e
L SrcSpan
loc (XBindStmt GhcRn GhcRn (Located (body GhcRn))
-> LPat GhcRn
-> Located (body GhcRn)
-> SyntaxExpr GhcRn
-> SyntaxExpr GhcRn
-> StmtLR GhcRn GhcRn (Located (body GhcRn))
forall idL idR body.
XBindStmt idL idR body
-> LPat idL
-> body
-> SyntaxExpr idR
-> SyntaxExpr idR
-> StmtLR idL idR body
BindStmt XBindStmt GhcRn GhcRn (Located (body GhcRn))
NoExt
noExt LPat GhcRn
pat' Located (body GhcRn)
body' SyntaxExpr GhcRn
bind_op SyntaxExpr GhcRn
fail_op))] }

rn_rec_stmt _ _ (L _ (LetStmt _ (L _ binds :: HsLocalBindsLR GhcRn GhcPs
binds@(HsIPBinds {}))), _)
  = MsgDoc -> RnM [Segment (LStmt GhcRn (Located (body GhcRn)))]
forall a. MsgDoc -> TcRn a
failWith (MsgDoc -> HsLocalBindsLR GhcRn GhcPs -> MsgDoc
forall a. Outputable a => MsgDoc -> a -> MsgDoc
badIpBinds (String -> MsgDoc
text "an mdo expression") HsLocalBindsLR GhcRn GhcPs
binds)

rn_rec_stmt _ all_bndrs :: [Name]
all_bndrs (L loc :: SrcSpan
loc (LetStmt _ (L l :: SrcSpan
l (HsValBinds x :: XHsValBinds GhcRn GhcPs
x binds' :: HsValBindsLR GhcRn GhcPs
binds'))), _)
  = do { (binds' :: HsValBinds GhcRn
binds', du_binds :: DefUses
du_binds) <- FreeVars
-> HsValBindsLR GhcRn GhcPs -> RnM (HsValBinds GhcRn, DefUses)
rnLocalValBindsRHS ([Name] -> FreeVars
mkNameSet [Name]
all_bndrs) HsValBindsLR GhcRn GhcPs
binds'
           -- fixities and unused are handled above in rnRecStmtsAndThen
       ; let fvs :: FreeVars
fvs = DefUses -> FreeVars
allUses DefUses
du_binds
       ; [Segment (LStmt GhcRn (Located (body GhcRn)))]
-> RnM [Segment (LStmt GhcRn (Located (body GhcRn)))]
forall (m :: * -> *) a. Monad m => a -> m a
return [(DefUses -> FreeVars
duDefs DefUses
du_binds, FreeVars
fvs, FreeVars
emptyNameSet,
                 SrcSpan
-> StmtLR GhcRn GhcRn (Located (body GhcRn))
-> LStmt GhcRn (Located (body GhcRn))
forall l e. l -> e -> GenLocated l e
L SrcSpan
loc (XLetStmt GhcRn GhcRn (Located (body GhcRn))
-> LHsLocalBinds GhcRn -> StmtLR GhcRn GhcRn (Located (body GhcRn))
forall idL idR body.
XLetStmt idL idR body
-> LHsLocalBindsLR idL idR -> StmtLR idL idR body
LetStmt XLetStmt GhcRn GhcRn (Located (body GhcRn))
NoExt
noExt (SrcSpan -> HsLocalBinds GhcRn -> LHsLocalBinds GhcRn
forall l e. l -> e -> GenLocated l e
L SrcSpan
l (XHsValBinds GhcRn GhcRn -> HsValBinds GhcRn -> HsLocalBinds GhcRn
forall idL idR.
XHsValBinds idL idR
-> HsValBindsLR idL idR -> HsLocalBindsLR idL idR
HsValBinds XHsValBinds GhcRn GhcPs
XHsValBinds GhcRn GhcRn
x HsValBinds GhcRn
binds'))))] }

-- no RecStmt case because they get flattened above when doing the LHSes
rn_rec_stmt _ _ stmt :: (LStmtLR GhcRn GhcPs (Located (body GhcPs)), FreeVars)
stmt@(L _ (RecStmt {}), _)
  = String
-> MsgDoc -> RnM [Segment (LStmt GhcRn (Located (body GhcRn)))]
forall a. HasCallStack => String -> MsgDoc -> a
pprPanic "rn_rec_stmt: RecStmt" ((LStmtLR GhcRn GhcPs (Located (body GhcPs)), FreeVars) -> MsgDoc
forall a. Outputable a => a -> MsgDoc
ppr (LStmtLR GhcRn GhcPs (Located (body GhcPs)), FreeVars)
stmt)

rn_rec_stmt _ _ stmt :: (LStmtLR GhcRn GhcPs (Located (body GhcPs)), FreeVars)
stmt@(L _ (ParStmt {}), _)       -- Syntactically illegal in mdo
  = String
-> MsgDoc -> RnM [Segment (LStmt GhcRn (Located (body GhcRn)))]
forall a. HasCallStack => String -> MsgDoc -> a
pprPanic "rn_rec_stmt: ParStmt" ((LStmtLR GhcRn GhcPs (Located (body GhcPs)), FreeVars) -> MsgDoc
forall a. Outputable a => a -> MsgDoc
ppr (LStmtLR GhcRn GhcPs (Located (body GhcPs)), FreeVars)
stmt)

rn_rec_stmt _ _ stmt :: (LStmtLR GhcRn GhcPs (Located (body GhcPs)), FreeVars)
stmt@(L _ (TransStmt {}), _)     -- Syntactically illegal in mdo
  = String
-> MsgDoc -> RnM [Segment (LStmt GhcRn (Located (body GhcRn)))]
forall a. HasCallStack => String -> MsgDoc -> a
pprPanic "rn_rec_stmt: TransStmt" ((LStmtLR GhcRn GhcPs (Located (body GhcPs)), FreeVars) -> MsgDoc
forall a. Outputable a => a -> MsgDoc
ppr (LStmtLR GhcRn GhcPs (Located (body GhcPs)), FreeVars)
stmt)

rn_rec_stmt _ _ (L _ (LetStmt _ (L _ (XHsLocalBindsLR _))), _)
  = String -> RnM [Segment (LStmt GhcRn (Located (body GhcRn)))]
forall a. String -> a
panic "rn_rec_stmt: LetStmt XHsLocalBindsLR"

rn_rec_stmt _ _ (L _ (LetStmt _ (L _ (EmptyLocalBinds _))), _)
  = String -> RnM [Segment (LStmt GhcRn (Located (body GhcRn)))]
forall a. String -> a
panic "rn_rec_stmt: LetStmt EmptyLocalBinds"

rn_rec_stmt _ _ stmt :: (LStmtLR GhcRn GhcPs (Located (body GhcPs)), FreeVars)
stmt@(L _ (ApplicativeStmt {}), _)
  = String
-> MsgDoc -> RnM [Segment (LStmt GhcRn (Located (body GhcRn)))]
forall a. HasCallStack => String -> MsgDoc -> a
pprPanic "rn_rec_stmt: ApplicativeStmt" ((LStmtLR GhcRn GhcPs (Located (body GhcPs)), FreeVars) -> MsgDoc
forall a. Outputable a => a -> MsgDoc
ppr (LStmtLR GhcRn GhcPs (Located (body GhcPs)), FreeVars)
stmt)

rn_rec_stmt _ _ stmt :: (LStmtLR GhcRn GhcPs (Located (body GhcPs)), FreeVars)
stmt@(L _ (XStmtLR {}), _)
  = String
-> MsgDoc -> RnM [Segment (LStmt GhcRn (Located (body GhcRn)))]
forall a. HasCallStack => String -> MsgDoc -> a
pprPanic "rn_rec_stmt: XStmtLR" ((LStmtLR GhcRn GhcPs (Located (body GhcPs)), FreeVars) -> MsgDoc
forall a. Outputable a => a -> MsgDoc
ppr (LStmtLR GhcRn GhcPs (Located (body GhcPs)), FreeVars)
stmt)

rn_rec_stmts :: Outputable (body GhcPs) =>
                (Located (body GhcPs) -> RnM (Located (body GhcRn), FreeVars))
             -> [Name]
             -> [(LStmtLR GhcRn GhcPs (Located (body GhcPs)), FreeVars)]
             -> RnM [Segment (LStmt GhcRn (Located (body GhcRn)))]
rn_rec_stmts :: (Located (body GhcPs) -> RnM (Located (body GhcRn), FreeVars))
-> [Name]
-> [(LStmtLR GhcRn GhcPs (Located (body GhcPs)), FreeVars)]
-> RnM [Segment (LStmt GhcRn (Located (body GhcRn)))]
rn_rec_stmts rnBody :: Located (body GhcPs) -> RnM (Located (body GhcRn), FreeVars)
rnBody bndrs :: [Name]
bndrs stmts :: [(LStmtLR GhcRn GhcPs (Located (body GhcPs)), FreeVars)]
stmts
  = do { [[Segment (LStmt GhcRn (Located (body GhcRn)))]]
segs_s <- ((LStmtLR GhcRn GhcPs (Located (body GhcPs)), FreeVars)
 -> RnM [Segment (LStmt GhcRn (Located (body GhcRn)))])
-> [(LStmtLR GhcRn GhcPs (Located (body GhcPs)), FreeVars)]
-> IOEnv
     (Env TcGblEnv TcLclEnv)
     [[Segment (LStmt GhcRn (Located (body GhcRn)))]]
forall (t :: * -> *) (m :: * -> *) a b.
(Traversable t, Monad m) =>
(a -> m b) -> t a -> m (t b)
mapM ((Located (body GhcPs) -> RnM (Located (body GhcRn), FreeVars))
-> [Name]
-> (LStmtLR GhcRn GhcPs (Located (body GhcPs)), FreeVars)
-> RnM [Segment (LStmt GhcRn (Located (body GhcRn)))]
forall (body :: * -> *).
Outputable (body GhcPs) =>
(Located (body GhcPs) -> RnM (Located (body GhcRn), FreeVars))
-> [Name]
-> (LStmtLR GhcRn GhcPs (Located (body GhcPs)), FreeVars)
-> RnM [Segment (LStmt GhcRn (Located (body GhcRn)))]
rn_rec_stmt Located (body GhcPs) -> RnM (Located (body GhcRn), FreeVars)
rnBody [Name]
bndrs) [(LStmtLR GhcRn GhcPs (Located (body GhcPs)), FreeVars)]
stmts
       ; [Segment (LStmt GhcRn (Located (body GhcRn)))]
-> RnM [Segment (LStmt GhcRn (Located (body GhcRn)))]
forall (m :: * -> *) a. Monad m => a -> m a
return ([[Segment (LStmt GhcRn (Located (body GhcRn)))]]
-> [Segment (LStmt GhcRn (Located (body GhcRn)))]
forall (t :: * -> *) a. Foldable t => t [a] -> [a]
concat [[Segment (LStmt GhcRn (Located (body GhcRn)))]]
segs_s) }

---------------------------------------------
segmentRecStmts :: SrcSpan -> HsStmtContext Name
                -> Stmt GhcRn body
                -> [Segment (LStmt GhcRn body)] -> FreeVars
                -> ([LStmt GhcRn body], FreeVars)

segmentRecStmts :: SrcSpan
-> HsStmtContext Name
-> Stmt GhcRn body
-> [Segment (LStmt GhcRn body)]
-> FreeVars
-> ([LStmt GhcRn body], FreeVars)
segmentRecStmts loc :: SrcSpan
loc ctxt :: HsStmtContext Name
ctxt empty_rec_stmt :: Stmt GhcRn body
empty_rec_stmt segs :: [Segment (LStmt GhcRn body)]
segs fvs_later :: FreeVars
fvs_later
  | [Segment (LStmt GhcRn body)] -> Bool
forall (t :: * -> *) a. Foldable t => t a -> Bool
null [Segment (LStmt GhcRn body)]
segs
  = ([], FreeVars
fvs_later)

  | HsStmtContext Name
MDoExpr <- HsStmtContext Name
ctxt
  = Stmt GhcRn body
-> [Segment [LStmt GhcRn body]]
-> FreeVars
-> ([LStmt GhcRn body], FreeVars)
forall body.
Stmt GhcRn body
-> [Segment [LStmt GhcRn body]]
-> FreeVars
-> ([LStmt GhcRn body], FreeVars)
segsToStmts Stmt GhcRn body
empty_rec_stmt [Segment [LStmt GhcRn body]]
grouped_segs FreeVars
fvs_later
               -- Step 4: Turn the segments into Stmts
                --         Use RecStmt when and only when there are fwd refs
                --         Also gather up the uses from the end towards the
                --         start, so we can tell the RecStmt which things are
                --         used 'after' the RecStmt

  | Bool
otherwise
  = ([ SrcSpan -> Stmt GhcRn body -> LStmt GhcRn body
forall l e. l -> e -> GenLocated l e
L SrcSpan
loc (Stmt GhcRn body -> LStmt GhcRn body)
-> Stmt GhcRn body -> LStmt GhcRn body
forall a b. (a -> b) -> a -> b
$
       Stmt GhcRn body
empty_rec_stmt { recS_stmts :: [LStmt GhcRn body]
recS_stmts = [LStmt GhcRn body]
ss
                      , recS_later_ids :: [IdP GhcRn]
recS_later_ids = FreeVars -> [Name]
nameSetElemsStable
                                           (FreeVars
defs FreeVars -> FreeVars -> FreeVars
`intersectNameSet` FreeVars
fvs_later)
                      , recS_rec_ids :: [IdP GhcRn]
recS_rec_ids   = FreeVars -> [Name]
nameSetElemsStable
                                           (FreeVars
defs FreeVars -> FreeVars -> FreeVars
`intersectNameSet` FreeVars
uses) }]
          -- See Note [Deterministic ApplicativeDo and RecursiveDo desugaring]
    , FreeVars
uses FreeVars -> FreeVars -> FreeVars
`plusFV` FreeVars
fvs_later)

  where
    (defs_s :: [FreeVars]
defs_s, uses_s :: [FreeVars]
uses_s, _, ss :: [LStmt GhcRn body]
ss) = [Segment (LStmt GhcRn body)]
-> ([FreeVars], [FreeVars], [FreeVars], [LStmt GhcRn body])
forall a b c d. [(a, b, c, d)] -> ([a], [b], [c], [d])
unzip4 [Segment (LStmt GhcRn body)]
segs
    defs :: FreeVars
defs = [FreeVars] -> FreeVars
plusFVs [FreeVars]
defs_s
    uses :: FreeVars
uses = [FreeVars] -> FreeVars
plusFVs [FreeVars]
uses_s

                -- Step 2: Fill in the fwd refs.
                --         The segments are all singletons, but their fwd-ref
                --         field mentions all the things used by the segment
                --         that are bound after their use
    segs_w_fwd_refs :: [Segment (LStmt GhcRn body)]
segs_w_fwd_refs = [Segment (LStmt GhcRn body)] -> [Segment (LStmt GhcRn body)]
forall a. [Segment a] -> [Segment a]
addFwdRefs [Segment (LStmt GhcRn body)]
segs

                -- Step 3: Group together the segments to make bigger segments
                --         Invariant: in the result, no segment uses a variable
                --                    bound in a later segment
    grouped_segs :: [Segment [LStmt GhcRn body]]
grouped_segs = HsStmtContext Name
-> [Segment (LStmt GhcRn body)] -> [Segment [LStmt GhcRn body]]
forall body.
HsStmtContext Name
-> [Segment (LStmt GhcRn body)] -> [Segment [LStmt GhcRn body]]
glomSegments HsStmtContext Name
ctxt [Segment (LStmt GhcRn body)]
segs_w_fwd_refs

----------------------------
addFwdRefs :: [Segment a] -> [Segment a]
-- So far the segments only have forward refs *within* the Stmt
--      (which happens for bind:  x <- ...x...)
-- This function adds the cross-seg fwd ref info

addFwdRefs :: [Segment a] -> [Segment a]
addFwdRefs segs :: [Segment a]
segs
  = ([Segment a], FreeVars) -> [Segment a]
forall a b. (a, b) -> a
fst ((Segment a -> ([Segment a], FreeVars) -> ([Segment a], FreeVars))
-> ([Segment a], FreeVars)
-> [Segment a]
-> ([Segment a], FreeVars)
forall (t :: * -> *) a b.
Foldable t =>
(a -> b -> b) -> b -> t a -> b
foldr Segment a -> ([Segment a], FreeVars) -> ([Segment a], FreeVars)
forall d.
(FreeVars, FreeVars, FreeVars, d)
-> ([(FreeVars, FreeVars, FreeVars, d)], FreeVars)
-> ([(FreeVars, FreeVars, FreeVars, d)], FreeVars)
mk_seg ([], FreeVars
emptyNameSet) [Segment a]
segs)
  where
    mk_seg :: (FreeVars, FreeVars, FreeVars, d)
-> ([(FreeVars, FreeVars, FreeVars, d)], FreeVars)
-> ([(FreeVars, FreeVars, FreeVars, d)], FreeVars)
mk_seg (defs :: FreeVars
defs, uses :: FreeVars
uses, fwds :: FreeVars
fwds, stmts :: d
stmts) (segs :: [(FreeVars, FreeVars, FreeVars, d)]
segs, later_defs :: FreeVars
later_defs)
        = ((FreeVars, FreeVars, FreeVars, d)
new_seg (FreeVars, FreeVars, FreeVars, d)
-> [(FreeVars, FreeVars, FreeVars, d)]
-> [(FreeVars, FreeVars, FreeVars, d)]
forall a. a -> [a] -> [a]
: [(FreeVars, FreeVars, FreeVars, d)]
segs, FreeVars
all_defs)
        where
          new_seg :: (FreeVars, FreeVars, FreeVars, d)
new_seg = (FreeVars
defs, FreeVars
uses, FreeVars
new_fwds, d
stmts)
          all_defs :: FreeVars
all_defs = FreeVars
later_defs FreeVars -> FreeVars -> FreeVars
`unionNameSet` FreeVars
defs
          new_fwds :: FreeVars
new_fwds = FreeVars
fwds FreeVars -> FreeVars -> FreeVars
`unionNameSet` (FreeVars
uses FreeVars -> FreeVars -> FreeVars
`intersectNameSet` FreeVars
later_defs)
                -- Add the downstream fwd refs here

{-
Note [Segmenting mdo]
~~~~~~~~~~~~~~~~~~~~~
NB. June 7 2012: We only glom segments that appear in an explicit mdo;
and leave those found in "do rec"'s intact.  See
http://ghc.haskell.org/trac/ghc/ticket/4148 for the discussion
leading to this design choice.  Hence the test in segmentRecStmts.

Note [Glomming segments]
~~~~~~~~~~~~~~~~~~~~~~~~
Glomming the singleton segments of an mdo into minimal recursive groups.

At first I thought this was just strongly connected components, but
there's an important constraint: the order of the stmts must not change.

Consider
     mdo { x <- ...y...
           p <- z
           y <- ...x...
           q <- x
           z <- y
           r <- x }

Here, the first stmt mention 'y', which is bound in the third.
But that means that the innocent second stmt (p <- z) gets caught
up in the recursion.  And that in turn means that the binding for
'z' has to be included... and so on.

Start at the tail { r <- x }
Now add the next one { z <- y ; r <- x }
Now add one more     { q <- x ; z <- y ; r <- x }
Now one more... but this time we have to group a bunch into rec
     { rec { y <- ...x... ; q <- x ; z <- y } ; r <- x }
Now one more, which we can add on without a rec
     { p <- z ;
       rec { y <- ...x... ; q <- x ; z <- y } ;
       r <- x }
Finally we add the last one; since it mentions y we have to
glom it together with the first two groups
     { rec { x <- ...y...; p <- z ; y <- ...x... ;
             q <- x ; z <- y } ;
       r <- x }
-}

glomSegments :: HsStmtContext Name
             -> [Segment (LStmt GhcRn body)]
             -> [Segment [LStmt GhcRn body]]
                                  -- Each segment has a non-empty list of Stmts
-- See Note [Glomming segments]

glomSegments :: HsStmtContext Name
-> [Segment (LStmt GhcRn body)] -> [Segment [LStmt GhcRn body]]
glomSegments _ [] = []
glomSegments ctxt :: HsStmtContext Name
ctxt ((defs :: FreeVars
defs,uses :: FreeVars
uses,fwds :: FreeVars
fwds,stmt :: LStmt GhcRn body
stmt) : segs :: [Segment (LStmt GhcRn body)]
segs)
        -- Actually stmts will always be a singleton
  = (FreeVars
seg_defs, FreeVars
seg_uses, FreeVars
seg_fwds, [LStmt GhcRn body]
seg_stmts)  Segment [LStmt GhcRn body]
-> [Segment [LStmt GhcRn body]] -> [Segment [LStmt GhcRn body]]
forall a. a -> [a] -> [a]
: [Segment [LStmt GhcRn body]]
others
  where
    segs' :: [Segment [LStmt GhcRn body]]
segs'            = HsStmtContext Name
-> [Segment (LStmt GhcRn body)] -> [Segment [LStmt GhcRn body]]
forall body.
HsStmtContext Name
-> [Segment (LStmt GhcRn body)] -> [Segment [LStmt GhcRn body]]
glomSegments HsStmtContext Name
ctxt [Segment (LStmt GhcRn body)]
segs
    (extras :: [Segment [LStmt GhcRn body]]
extras, others :: [Segment [LStmt GhcRn body]]
others) = FreeVars
-> [Segment [LStmt GhcRn body]]
-> ([Segment [LStmt GhcRn body]], [Segment [LStmt GhcRn body]])
forall a. FreeVars -> [Segment a] -> ([Segment a], [Segment a])
grab FreeVars
uses [Segment [LStmt GhcRn body]]
segs'
    (ds :: [FreeVars]
ds, us :: [FreeVars]
us, fs :: [FreeVars]
fs, ss :: [[LStmt GhcRn body]]
ss) = [Segment [LStmt GhcRn body]]
-> ([FreeVars], [FreeVars], [FreeVars], [[LStmt GhcRn body]])
forall a b c d. [(a, b, c, d)] -> ([a], [b], [c], [d])
unzip4 [Segment [LStmt GhcRn body]]
extras

    seg_defs :: FreeVars
seg_defs  = [FreeVars] -> FreeVars
plusFVs [FreeVars]
ds FreeVars -> FreeVars -> FreeVars
`plusFV` FreeVars
defs
    seg_uses :: FreeVars
seg_uses  = [FreeVars] -> FreeVars
plusFVs [FreeVars]
us FreeVars -> FreeVars -> FreeVars
`plusFV` FreeVars
uses
    seg_fwds :: FreeVars
seg_fwds  = [FreeVars] -> FreeVars
plusFVs [FreeVars]
fs FreeVars -> FreeVars -> FreeVars
`plusFV` FreeVars
fwds
    seg_stmts :: [LStmt GhcRn body]
seg_stmts = LStmt GhcRn body
stmt LStmt GhcRn body -> [LStmt GhcRn body] -> [LStmt GhcRn body]
forall a. a -> [a] -> [a]
: [[LStmt GhcRn body]] -> [LStmt GhcRn body]
forall (t :: * -> *) a. Foldable t => t [a] -> [a]
concat [[LStmt GhcRn body]]
ss

    grab :: NameSet             -- The client
         -> [Segment a]
         -> ([Segment a],       -- Needed by the 'client'
             [Segment a])       -- Not needed by the client
        -- The result is simply a split of the input
    grab :: FreeVars -> [Segment a] -> ([Segment a], [Segment a])
grab uses :: FreeVars
uses dus :: [Segment a]
dus
        = ([Segment a] -> [Segment a]
forall a. [a] -> [a]
reverse [Segment a]
yeses, [Segment a] -> [Segment a]
forall a. [a] -> [a]
reverse [Segment a]
noes)
        where
          (noes :: [Segment a]
noes, yeses :: [Segment a]
yeses)           = (Segment a -> Bool) -> [Segment a] -> ([Segment a], [Segment a])
forall a. (a -> Bool) -> [a] -> ([a], [a])
span Segment a -> Bool
not_needed ([Segment a] -> [Segment a]
forall a. [a] -> [a]
reverse [Segment a]
dus)
          not_needed :: Segment a -> Bool
not_needed (defs :: FreeVars
defs,_,_,_) = Bool -> Bool
not (FreeVars -> FreeVars -> Bool
intersectsNameSet FreeVars
defs FreeVars
uses)

----------------------------------------------------
segsToStmts :: Stmt GhcRn body
                                  -- A RecStmt with the SyntaxOps filled in
            -> [Segment [LStmt GhcRn body]]
                                  -- Each Segment has a non-empty list of Stmts
            -> FreeVars           -- Free vars used 'later'
            -> ([LStmt GhcRn body], FreeVars)

segsToStmts :: Stmt GhcRn body
-> [Segment [LStmt GhcRn body]]
-> FreeVars
-> ([LStmt GhcRn body], FreeVars)
segsToStmts _ [] fvs_later :: FreeVars
fvs_later = ([], FreeVars
fvs_later)
segsToStmts empty_rec_stmt :: Stmt GhcRn body
empty_rec_stmt ((defs :: FreeVars
defs, uses :: FreeVars
uses, fwds :: FreeVars
fwds, ss :: [LStmt GhcRn body]
ss) : segs :: [Segment [LStmt GhcRn body]]
segs) fvs_later :: FreeVars
fvs_later
  = ASSERT( not (null ss) )
    (LStmt GhcRn body
new_stmt LStmt GhcRn body -> [LStmt GhcRn body] -> [LStmt GhcRn body]
forall a. a -> [a] -> [a]
: [LStmt GhcRn body]
later_stmts, FreeVars
later_uses FreeVars -> FreeVars -> FreeVars
`plusFV` FreeVars
uses)
  where
    (later_stmts :: [LStmt GhcRn body]
later_stmts, later_uses :: FreeVars
later_uses) = Stmt GhcRn body
-> [Segment [LStmt GhcRn body]]
-> FreeVars
-> ([LStmt GhcRn body], FreeVars)
forall body.
Stmt GhcRn body
-> [Segment [LStmt GhcRn body]]
-> FreeVars
-> ([LStmt GhcRn body], FreeVars)
segsToStmts Stmt GhcRn body
empty_rec_stmt [Segment [LStmt GhcRn body]]
segs FreeVars
fvs_later
    new_stmt :: LStmt GhcRn body
new_stmt | Bool
non_rec   = [LStmt GhcRn body] -> LStmt GhcRn body
forall a. [a] -> a
head [LStmt GhcRn body]
ss
             | Bool
otherwise = SrcSpan -> SrcSpanLess (LStmt GhcRn body) -> LStmt GhcRn body
forall a. HasSrcSpan a => SrcSpan -> SrcSpanLess a -> a
cL (LStmt GhcRn body -> SrcSpan
forall a. HasSrcSpan a => a -> SrcSpan
getLoc ([LStmt GhcRn body] -> LStmt GhcRn body
forall a. [a] -> a
head [LStmt GhcRn body]
ss)) SrcSpanLess (LStmt GhcRn body)
Stmt GhcRn body
rec_stmt
    rec_stmt :: Stmt GhcRn body
rec_stmt = Stmt GhcRn body
empty_rec_stmt { recS_stmts :: [LStmt GhcRn body]
recS_stmts     = [LStmt GhcRn body]
ss
                              , recS_later_ids :: [IdP GhcRn]
recS_later_ids = FreeVars -> [Name]
nameSetElemsStable FreeVars
used_later
                              , recS_rec_ids :: [IdP GhcRn]
recS_rec_ids   = FreeVars -> [Name]
nameSetElemsStable FreeVars
fwds }
          -- See Note [Deterministic ApplicativeDo and RecursiveDo desugaring]
    non_rec :: Bool
non_rec    = [LStmt GhcRn body] -> Bool
forall a. [a] -> Bool
isSingleton [LStmt GhcRn body]
ss Bool -> Bool -> Bool
&& FreeVars -> Bool
isEmptyNameSet FreeVars
fwds
    used_later :: FreeVars
used_later = FreeVars
defs FreeVars -> FreeVars -> FreeVars
`intersectNameSet` FreeVars
later_uses
                                -- The ones needed after the RecStmt

{-
************************************************************************
*                                                                      *
ApplicativeDo
*                                                                      *
************************************************************************

Note [ApplicativeDo]

= Example =

For a sequence of statements

 do
     x <- A
     y <- B x
     z <- C
     return (f x y z)

We want to transform this to

  (\(x,y) z -> f x y z) <$> (do x <- A; y <- B x; return (x,y)) <*> C

It would be easy to notice that "y <- B x" and "z <- C" are
independent and do something like this:

 do
     x <- A
     (y,z) <- (,) <$> B x <*> C
     return (f x y z)

But this isn't enough! A and C were also independent, and this
transformation loses the ability to do A and C in parallel.

The algorithm works by first splitting the sequence of statements into
independent "segments", and a separate "tail" (the final statement). In
our example above, the segements would be

     [ x <- A
     , y <- B x ]

     [ z <- C ]

and the tail is:

     return (f x y z)

Then we take these segments and make an Applicative expression from them:

     (\(x,y) z -> return (f x y z))
       <$> do { x <- A; y <- B x; return (x,y) }
       <*> C

Finally, we recursively apply the transformation to each segment, to
discover any nested parallelism.

= Syntax & spec =

  expr ::= ... | do {stmt_1; ..; stmt_n} expr | ...

  stmt ::= pat <- expr
         | (arg_1 | ... | arg_n)  -- applicative composition, n>=1
         | ...                    -- other kinds of statement (e.g. let)

  arg ::= pat <- expr
        | {stmt_1; ..; stmt_n} {var_1..var_n}

(note that in the actual implementation,the expr in a do statement is
represented by a LastStmt as the final stmt, this is just a
representational issue and may change later.)

== Transformation to introduce applicative stmts ==

ado {} tail = tail
ado {pat <- expr} {return expr'} = (mkArg(pat <- expr)); return expr'
ado {one} tail = one : tail
ado stmts tail
  | n == 1 = ado before (ado after tail)
    where (before,after) = split(stmts_1)
  | n > 1  = (mkArg(stmts_1) | ... | mkArg(stmts_n)); tail
  where
    {stmts_1 .. stmts_n} = segments(stmts)

segments(stmts) =
  -- divide stmts into segments with no interdependencies

mkArg({pat <- expr}) = (pat <- expr)
mkArg({stmt_1; ...; stmt_n}) =
  {stmt_1; ...; stmt_n} {vars(stmt_1) u .. u vars(stmt_n)}

split({stmt_1; ..; stmt_n) =
  ({stmt_1; ..; stmt_i}, {stmt_i+1; ..; stmt_n})
  -- 1 <= i <= n
  -- i is a good place to insert a bind

== Desugaring for do ==

dsDo {} expr = expr

dsDo {pat <- rhs; stmts} expr =
   rhs >>= \pat -> dsDo stmts expr

dsDo {(arg_1 | ... | arg_n)} (return expr) =
  (\argpat (arg_1) .. argpat(arg_n) -> expr)
     <$> argexpr(arg_1)
     <*> ...
     <*> argexpr(arg_n)

dsDo {(arg_1 | ... | arg_n); stmts} expr =
  join (\argpat (arg_1) .. argpat(arg_n) -> dsDo stmts expr)
     <$> argexpr(arg_1)
     <*> ...
     <*> argexpr(arg_n)

-}

-- | The 'Name's of @return@ and @pure@. These may not be 'returnName' and
-- 'pureName' due to @RebindableSyntax@.
data MonadNames = MonadNames { MonadNames -> Name
return_name, MonadNames -> Name
pure_name :: Name }

-- | rearrange a list of statements using ApplicativeDoStmt.  See
-- Note [ApplicativeDo].
rearrangeForApplicativeDo
  :: HsStmtContext Name
  -> [(ExprLStmt GhcRn, FreeVars)]
  -> RnM ([ExprLStmt GhcRn], FreeVars)

rearrangeForApplicativeDo :: HsStmtContext Name
-> [(LStmt GhcRn (LHsExpr GhcRn), FreeVars)]
-> RnM ([LStmt GhcRn (LHsExpr GhcRn)], FreeVars)
rearrangeForApplicativeDo _ [] = ([LStmt GhcRn (LHsExpr GhcRn)], FreeVars)
-> RnM ([LStmt GhcRn (LHsExpr GhcRn)], FreeVars)
forall (m :: * -> *) a. Monad m => a -> m a
return ([], FreeVars
emptyNameSet)
rearrangeForApplicativeDo _ [(one :: LStmt GhcRn (LHsExpr GhcRn)
one,_)] = ([LStmt GhcRn (LHsExpr GhcRn)], FreeVars)
-> RnM ([LStmt GhcRn (LHsExpr GhcRn)], FreeVars)
forall (m :: * -> *) a. Monad m => a -> m a
return ([LStmt GhcRn (LHsExpr GhcRn)
one], FreeVars
emptyNameSet)
rearrangeForApplicativeDo ctxt :: HsStmtContext Name
ctxt stmts0 :: [(LStmt GhcRn (LHsExpr GhcRn), FreeVars)]
stmts0 = do
  Bool
optimal_ado <- GeneralFlag -> TcRnIf TcGblEnv TcLclEnv Bool
forall gbl lcl. GeneralFlag -> TcRnIf gbl lcl Bool
goptM GeneralFlag
Opt_OptimalApplicativeDo
  let stmt_tree :: ExprStmtTree
stmt_tree | Bool
optimal_ado = [(LStmt GhcRn (LHsExpr GhcRn), FreeVars)] -> ExprStmtTree
mkStmtTreeOptimal [(LStmt GhcRn (LHsExpr GhcRn), FreeVars)]
stmts
                | Bool
otherwise = [(LStmt GhcRn (LHsExpr GhcRn), FreeVars)] -> ExprStmtTree
mkStmtTreeHeuristic [(LStmt GhcRn (LHsExpr GhcRn), FreeVars)]
stmts
  String -> MsgDoc -> IOEnv (Env TcGblEnv TcLclEnv) ()
traceRn "rearrangeForADo" (ExprStmtTree -> MsgDoc
forall a. Outputable a => a -> MsgDoc
ppr ExprStmtTree
stmt_tree)
  Name
return_name <- Name -> RnM Name
lookupSyntaxName' Name
returnMName
  Name
pure_name   <- Name -> RnM Name
lookupSyntaxName' Name
pureAName
  let monad_names :: MonadNames
monad_names = MonadNames :: Name -> Name -> MonadNames
MonadNames { return_name :: Name
return_name = Name
return_name
                               , pure_name :: Name
pure_name   = Name
pure_name }
  MonadNames
-> HsStmtContext Name
-> ExprStmtTree
-> [LStmt GhcRn (LHsExpr GhcRn)]
-> FreeVars
-> RnM ([LStmt GhcRn (LHsExpr GhcRn)], FreeVars)
stmtTreeToStmts MonadNames
monad_names HsStmtContext Name
ctxt ExprStmtTree
stmt_tree [LStmt GhcRn (LHsExpr GhcRn)
last] FreeVars
last_fvs
  where
    (stmts :: [(LStmt GhcRn (LHsExpr GhcRn), FreeVars)]
stmts,(last :: LStmt GhcRn (LHsExpr GhcRn)
last,last_fvs :: FreeVars
last_fvs)) = [(LStmt GhcRn (LHsExpr GhcRn), FreeVars)]
-> ([(LStmt GhcRn (LHsExpr GhcRn), FreeVars)],
    (LStmt GhcRn (LHsExpr GhcRn), FreeVars))
forall a. [a] -> ([a], a)
findLast [(LStmt GhcRn (LHsExpr GhcRn), FreeVars)]
stmts0
    findLast :: [a] -> ([a], a)
findLast [] = String -> ([a], a)
forall a. HasCallStack => String -> a
error "findLast"
    findLast [last :: a
last] = ([],a
last)
    findLast (x :: a
x:xs :: [a]
xs) = (a
xa -> [a] -> [a]
forall a. a -> [a] -> [a]
:[a]
rest,a
last) where (rest :: [a]
rest,last :: a
last) = [a] -> ([a], a)
findLast [a]
xs

-- | A tree of statements using a mixture of applicative and bind constructs.
data StmtTree a
  = StmtTreeOne a
  | StmtTreeBind (StmtTree a) (StmtTree a)
  | StmtTreeApplicative [StmtTree a]

instance Outputable a => Outputable (StmtTree a) where
  ppr :: StmtTree a -> MsgDoc
ppr (StmtTreeOne x :: a
x)          = MsgDoc -> MsgDoc
parens (String -> MsgDoc
text "StmtTreeOne" MsgDoc -> MsgDoc -> MsgDoc
<+> a -> MsgDoc
forall a. Outputable a => a -> MsgDoc
ppr a
x)
  ppr (StmtTreeBind x :: StmtTree a
x y :: StmtTree a
y)       = MsgDoc -> MsgDoc
parens (MsgDoc -> Int -> MsgDoc -> MsgDoc
hang (String -> MsgDoc
text "StmtTreeBind")
                                            2 ([MsgDoc] -> MsgDoc
sep [StmtTree a -> MsgDoc
forall a. Outputable a => a -> MsgDoc
ppr StmtTree a
x, StmtTree a -> MsgDoc
forall a. Outputable a => a -> MsgDoc
ppr StmtTree a
y]))
  ppr (StmtTreeApplicative xs :: [StmtTree a]
xs) = MsgDoc -> MsgDoc
parens (MsgDoc -> Int -> MsgDoc -> MsgDoc
hang (String -> MsgDoc
text "StmtTreeApplicative")
                                            2 ([MsgDoc] -> MsgDoc
vcat ((StmtTree a -> MsgDoc) -> [StmtTree a] -> [MsgDoc]
forall a b. (a -> b) -> [a] -> [b]
map StmtTree a -> MsgDoc
forall a. Outputable a => a -> MsgDoc
ppr [StmtTree a]
xs)))

flattenStmtTree :: StmtTree a -> [a]
flattenStmtTree :: StmtTree a -> [a]
flattenStmtTree t :: StmtTree a
t = StmtTree a -> [a] -> [a]
forall a. StmtTree a -> [a] -> [a]
go StmtTree a
t []
 where
  go :: StmtTree a -> [a] -> [a]
go (StmtTreeOne a :: a
a) as :: [a]
as = a
a a -> [a] -> [a]
forall a. a -> [a] -> [a]
: [a]
as
  go (StmtTreeBind l :: StmtTree a
l r :: StmtTree a
r) as :: [a]
as = StmtTree a -> [a] -> [a]
go StmtTree a
l (StmtTree a -> [a] -> [a]
go StmtTree a
r [a]
as)
  go (StmtTreeApplicative ts :: [StmtTree a]
ts) as :: [a]
as = (StmtTree a -> [a] -> [a]) -> [a] -> [StmtTree a] -> [a]
forall (t :: * -> *) a b.
Foldable t =>
(a -> b -> b) -> b -> t a -> b
foldr StmtTree a -> [a] -> [a]
go [a]
as [StmtTree a]
ts

type ExprStmtTree = StmtTree (ExprLStmt GhcRn, FreeVars)
type Cost = Int

-- | Turn a sequence of statements into an ExprStmtTree using a
-- heuristic algorithm.  /O(n^2)/
mkStmtTreeHeuristic :: [(ExprLStmt GhcRn, FreeVars)] -> ExprStmtTree
mkStmtTreeHeuristic :: [(LStmt GhcRn (LHsExpr GhcRn), FreeVars)] -> ExprStmtTree
mkStmtTreeHeuristic [one :: (LStmt GhcRn (LHsExpr GhcRn), FreeVars)
one] = (LStmt GhcRn (LHsExpr GhcRn), FreeVars) -> ExprStmtTree
forall a. a -> StmtTree a
StmtTreeOne (LStmt GhcRn (LHsExpr GhcRn), FreeVars)
one
mkStmtTreeHeuristic stmts :: [(LStmt GhcRn (LHsExpr GhcRn), FreeVars)]
stmts =
  case [(LStmt GhcRn (LHsExpr GhcRn), FreeVars)]
-> [[(LStmt GhcRn (LHsExpr GhcRn), FreeVars)]]
segments [(LStmt GhcRn (LHsExpr GhcRn), FreeVars)]
stmts of
    [one :: [(LStmt GhcRn (LHsExpr GhcRn), FreeVars)]
one] -> [(LStmt GhcRn (LHsExpr GhcRn), FreeVars)] -> ExprStmtTree
split [(LStmt GhcRn (LHsExpr GhcRn), FreeVars)]
one
    segs :: [[(LStmt GhcRn (LHsExpr GhcRn), FreeVars)]]
segs -> [ExprStmtTree] -> ExprStmtTree
forall a. [StmtTree a] -> StmtTree a
StmtTreeApplicative (([(LStmt GhcRn (LHsExpr GhcRn), FreeVars)] -> ExprStmtTree)
-> [[(LStmt GhcRn (LHsExpr GhcRn), FreeVars)]] -> [ExprStmtTree]
forall a b. (a -> b) -> [a] -> [b]
map [(LStmt GhcRn (LHsExpr GhcRn), FreeVars)] -> ExprStmtTree
split [[(LStmt GhcRn (LHsExpr GhcRn), FreeVars)]]
segs)
 where
  split :: [(LStmt GhcRn (LHsExpr GhcRn), FreeVars)] -> ExprStmtTree
split [one :: (LStmt GhcRn (LHsExpr GhcRn), FreeVars)
one] = (LStmt GhcRn (LHsExpr GhcRn), FreeVars) -> ExprStmtTree
forall a. a -> StmtTree a
StmtTreeOne (LStmt GhcRn (LHsExpr GhcRn), FreeVars)
one
  split stmts :: [(LStmt GhcRn (LHsExpr GhcRn), FreeVars)]
stmts =
    ExprStmtTree -> ExprStmtTree -> ExprStmtTree
forall a. StmtTree a -> StmtTree a -> StmtTree a
StmtTreeBind ([(LStmt GhcRn (LHsExpr GhcRn), FreeVars)] -> ExprStmtTree
mkStmtTreeHeuristic [(LStmt GhcRn (LHsExpr GhcRn), FreeVars)]
before) ([(LStmt GhcRn (LHsExpr GhcRn), FreeVars)] -> ExprStmtTree
mkStmtTreeHeuristic [(LStmt GhcRn (LHsExpr GhcRn), FreeVars)]
after)
    where (before :: [(LStmt GhcRn (LHsExpr GhcRn), FreeVars)]
before, after :: [(LStmt GhcRn (LHsExpr GhcRn), FreeVars)]
after) = [(LStmt GhcRn (LHsExpr GhcRn), FreeVars)]
-> ([(LStmt GhcRn (LHsExpr GhcRn), FreeVars)],
    [(LStmt GhcRn (LHsExpr GhcRn), FreeVars)])
splitSegment [(LStmt GhcRn (LHsExpr GhcRn), FreeVars)]
stmts

-- | Turn a sequence of statements into an ExprStmtTree optimally,
-- using dynamic programming.  /O(n^3)/
mkStmtTreeOptimal :: [(ExprLStmt GhcRn, FreeVars)] -> ExprStmtTree
mkStmtTreeOptimal :: [(LStmt GhcRn (LHsExpr GhcRn), FreeVars)] -> ExprStmtTree
mkStmtTreeOptimal stmts :: [(LStmt GhcRn (LHsExpr GhcRn), FreeVars)]
stmts =
  ASSERT(not (null stmts)) -- the empty case is handled by the caller;
                           -- we don't support empty StmtTrees.
  (ExprStmtTree, Int) -> ExprStmtTree
forall a b. (a, b) -> a
fst (Array (Int, Int) (ExprStmtTree, Int)
arr Array (Int, Int) (ExprStmtTree, Int)
-> (Int, Int) -> (ExprStmtTree, Int)
forall i e. Ix i => Array i e -> i -> e
! (0,Int
n))
  where
    n :: Int
n = [(LStmt GhcRn (LHsExpr GhcRn), FreeVars)] -> Int
forall (t :: * -> *) a. Foldable t => t a -> Int
length [(LStmt GhcRn (LHsExpr GhcRn), FreeVars)]
stmts Int -> Int -> Int
forall a. Num a => a -> a -> a
- 1
    stmt_arr :: Array Int (LStmt GhcRn (LHsExpr GhcRn), FreeVars)
stmt_arr = (Int, Int)
-> [(LStmt GhcRn (LHsExpr GhcRn), FreeVars)]
-> Array Int (LStmt GhcRn (LHsExpr GhcRn), FreeVars)
forall i e. Ix i => (i, i) -> [e] -> Array i e
listArray (0,Int
n) [(LStmt GhcRn (LHsExpr GhcRn), FreeVars)]
stmts

    -- lazy cache of optimal trees for subsequences of the input
    arr :: Array (Int,Int) (ExprStmtTree, Cost)
    arr :: Array (Int, Int) (ExprStmtTree, Int)
arr = ((Int, Int), (Int, Int))
-> [((Int, Int), (ExprStmtTree, Int))]
-> Array (Int, Int) (ExprStmtTree, Int)
forall i e. Ix i => (i, i) -> [(i, e)] -> Array i e
array ((0,0),(Int
n,Int
n))
             [ ((Int
lo,Int
hi), Int -> Int -> (ExprStmtTree, Int)
tree Int
lo Int
hi)
             | Int
lo <- [0..Int
n]
             , Int
hi <- [Int
lo..Int
n] ]

    -- compute the optimal tree for the sequence [lo..hi]
    tree :: Int -> Int -> (ExprStmtTree, Int)
tree lo :: Int
lo hi :: Int
hi
      | Int
hi Int -> Int -> Bool
forall a. Eq a => a -> a -> Bool
== Int
lo = ((LStmt GhcRn (LHsExpr GhcRn), FreeVars) -> ExprStmtTree
forall a. a -> StmtTree a
StmtTreeOne (Array Int (LStmt GhcRn (LHsExpr GhcRn), FreeVars)
stmt_arr Array Int (LStmt GhcRn (LHsExpr GhcRn), FreeVars)
-> Int -> (LStmt GhcRn (LHsExpr GhcRn), FreeVars)
forall i e. Ix i => Array i e -> i -> e
! Int
lo), 1)
      | Bool
otherwise =
         case [(LStmt GhcRn (LHsExpr GhcRn), FreeVars)]
-> [[(LStmt GhcRn (LHsExpr GhcRn), FreeVars)]]
segments [ Array Int (LStmt GhcRn (LHsExpr GhcRn), FreeVars)
stmt_arr Array Int (LStmt GhcRn (LHsExpr GhcRn), FreeVars)
-> Int -> (LStmt GhcRn (LHsExpr GhcRn), FreeVars)
forall i e. Ix i => Array i e -> i -> e
! Int
i | Int
i <- [Int
lo..Int
hi] ] of
           [] -> String -> (ExprStmtTree, Int)
forall a. String -> a
panic "mkStmtTree"
           [_one :: [(LStmt GhcRn (LHsExpr GhcRn), FreeVars)]
_one] -> Int -> Int -> (ExprStmtTree, Int)
split Int
lo Int
hi
           segs :: [[(LStmt GhcRn (LHsExpr GhcRn), FreeVars)]]
segs -> ([ExprStmtTree] -> ExprStmtTree
forall a. [StmtTree a] -> StmtTree a
StmtTreeApplicative [ExprStmtTree]
trees, [Int] -> Int
forall (t :: * -> *) a. (Foldable t, Ord a) => t a -> a
maximum [Int]
costs)
             where
               bounds :: [(Int, Int)]
bounds = ((Int, Int)
 -> [(LStmt GhcRn (LHsExpr GhcRn), FreeVars)] -> (Int, Int))
-> (Int, Int)
-> [[(LStmt GhcRn (LHsExpr GhcRn), FreeVars)]]
-> [(Int, Int)]
forall b a. (b -> a -> b) -> b -> [a] -> [b]
scanl (\(_,hi :: Int
hi) a :: [(LStmt GhcRn (LHsExpr GhcRn), FreeVars)]
a -> (Int
hiInt -> Int -> Int
forall a. Num a => a -> a -> a
+1, Int
hi Int -> Int -> Int
forall a. Num a => a -> a -> a
+ [(LStmt GhcRn (LHsExpr GhcRn), FreeVars)] -> Int
forall (t :: * -> *) a. Foldable t => t a -> Int
length [(LStmt GhcRn (LHsExpr GhcRn), FreeVars)]
a)) (0,Int
loInt -> Int -> Int
forall a. Num a => a -> a -> a
-1) [[(LStmt GhcRn (LHsExpr GhcRn), FreeVars)]]
segs
               (trees :: [ExprStmtTree]
trees,costs :: [Int]
costs) = [(ExprStmtTree, Int)] -> ([ExprStmtTree], [Int])
forall a b. [(a, b)] -> ([a], [b])
unzip (((Int, Int) -> (ExprStmtTree, Int))
-> [(Int, Int)] -> [(ExprStmtTree, Int)]
forall a b. (a -> b) -> [a] -> [b]
map ((Int -> Int -> (ExprStmtTree, Int))
-> (Int, Int) -> (ExprStmtTree, Int)
forall a b c. (a -> b -> c) -> (a, b) -> c
uncurry Int -> Int -> (ExprStmtTree, Int)
split) ([(Int, Int)] -> [(Int, Int)]
forall a. [a] -> [a]
tail [(Int, Int)]
bounds))

    -- find the best place to split the segment [lo..hi]
    split :: Int -> Int -> (ExprStmtTree, Cost)
    split :: Int -> Int -> (ExprStmtTree, Int)
split lo :: Int
lo hi :: Int
hi
      | Int
hi Int -> Int -> Bool
forall a. Eq a => a -> a -> Bool
== Int
lo = ((LStmt GhcRn (LHsExpr GhcRn), FreeVars) -> ExprStmtTree
forall a. a -> StmtTree a
StmtTreeOne (Array Int (LStmt GhcRn (LHsExpr GhcRn), FreeVars)
stmt_arr Array Int (LStmt GhcRn (LHsExpr GhcRn), FreeVars)
-> Int -> (LStmt GhcRn (LHsExpr GhcRn), FreeVars)
forall i e. Ix i => Array i e -> i -> e
! Int
lo), 1)
      | Bool
otherwise = (ExprStmtTree -> ExprStmtTree -> ExprStmtTree
forall a. StmtTree a -> StmtTree a -> StmtTree a
StmtTreeBind ExprStmtTree
before ExprStmtTree
after, Int
c1Int -> Int -> Int
forall a. Num a => a -> a -> a
+Int
c2)
        where
         -- As per the paper, for a sequence s1...sn, we want to find
         -- the split with the minimum cost, where the cost is the
         -- sum of the cost of the left and right subsequences.
         --
         -- As an optimisation (also in the paper) if the cost of
         -- s1..s(n-1) is different from the cost of s2..sn, we know
         -- that the optimal solution is the lower of the two.  Only
         -- in the case that these two have the same cost do we need
         -- to do the exhaustive search.
         --
         ((before :: ExprStmtTree
before,c1 :: Int
c1),(after :: ExprStmtTree
after,c2 :: Int
c2))
           | Int
hi Int -> Int -> Int
forall a. Num a => a -> a -> a
- Int
lo Int -> Int -> Bool
forall a. Eq a => a -> a -> Bool
== 1
           = (((LStmt GhcRn (LHsExpr GhcRn), FreeVars) -> ExprStmtTree
forall a. a -> StmtTree a
StmtTreeOne (Array Int (LStmt GhcRn (LHsExpr GhcRn), FreeVars)
stmt_arr Array Int (LStmt GhcRn (LHsExpr GhcRn), FreeVars)
-> Int -> (LStmt GhcRn (LHsExpr GhcRn), FreeVars)
forall i e. Ix i => Array i e -> i -> e
! Int
lo), 1),
              ((LStmt GhcRn (LHsExpr GhcRn), FreeVars) -> ExprStmtTree
forall a. a -> StmtTree a
StmtTreeOne (Array Int (LStmt GhcRn (LHsExpr GhcRn), FreeVars)
stmt_arr Array Int (LStmt GhcRn (LHsExpr GhcRn), FreeVars)
-> Int -> (LStmt GhcRn (LHsExpr GhcRn), FreeVars)
forall i e. Ix i => Array i e -> i -> e
! Int
hi), 1))
           | Int
left_cost Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
< Int
right_cost
           = ((ExprStmtTree
left,Int
left_cost), ((LStmt GhcRn (LHsExpr GhcRn), FreeVars) -> ExprStmtTree
forall a. a -> StmtTree a
StmtTreeOne (Array Int (LStmt GhcRn (LHsExpr GhcRn), FreeVars)
stmt_arr Array Int (LStmt GhcRn (LHsExpr GhcRn), FreeVars)
-> Int -> (LStmt GhcRn (LHsExpr GhcRn), FreeVars)
forall i e. Ix i => Array i e -> i -> e
! Int
hi), 1))
           | Int
left_cost Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
> Int
right_cost
           = (((LStmt GhcRn (LHsExpr GhcRn), FreeVars) -> ExprStmtTree
forall a. a -> StmtTree a
StmtTreeOne (Array Int (LStmt GhcRn (LHsExpr GhcRn), FreeVars)
stmt_arr Array Int (LStmt GhcRn (LHsExpr GhcRn), FreeVars)
-> Int -> (LStmt GhcRn (LHsExpr GhcRn), FreeVars)
forall i e. Ix i => Array i e -> i -> e
! Int
lo), 1), (ExprStmtTree
right,Int
right_cost))
           | Bool
otherwise = (((ExprStmtTree, Int), (ExprStmtTree, Int))
 -> ((ExprStmtTree, Int), (ExprStmtTree, Int)) -> Ordering)
-> [((ExprStmtTree, Int), (ExprStmtTree, Int))]
-> ((ExprStmtTree, Int), (ExprStmtTree, Int))
forall (t :: * -> *) a.
Foldable t =>
(a -> a -> Ordering) -> t a -> a
minimumBy ((((ExprStmtTree, Int), (ExprStmtTree, Int)) -> Int)
-> ((ExprStmtTree, Int), (ExprStmtTree, Int))
-> ((ExprStmtTree, Int), (ExprStmtTree, Int))
-> Ordering
forall a b. Ord a => (b -> a) -> b -> b -> Ordering
comparing ((ExprStmtTree, Int), (ExprStmtTree, Int)) -> Int
forall a a a. Num a => ((a, a), (a, a)) -> a
cost) [((ExprStmtTree, Int), (ExprStmtTree, Int))]
alternatives
           where
             (left :: ExprStmtTree
left, left_cost :: Int
left_cost) = Array (Int, Int) (ExprStmtTree, Int)
arr Array (Int, Int) (ExprStmtTree, Int)
-> (Int, Int) -> (ExprStmtTree, Int)
forall i e. Ix i => Array i e -> i -> e
! (Int
lo,Int
hiInt -> Int -> Int
forall a. Num a => a -> a -> a
-1)
             (right :: ExprStmtTree
right, right_cost :: Int
right_cost) = Array (Int, Int) (ExprStmtTree, Int)
arr Array (Int, Int) (ExprStmtTree, Int)
-> (Int, Int) -> (ExprStmtTree, Int)
forall i e. Ix i => Array i e -> i -> e
! (Int
loInt -> Int -> Int
forall a. Num a => a -> a -> a
+1,Int
hi)
             cost :: ((a, a), (a, a)) -> a
cost ((_,c1 :: a
c1),(_,c2 :: a
c2)) = a
c1 a -> a -> a
forall a. Num a => a -> a -> a
+ a
c2
             alternatives :: [((ExprStmtTree, Int), (ExprStmtTree, Int))]
alternatives = [ (Array (Int, Int) (ExprStmtTree, Int)
arr Array (Int, Int) (ExprStmtTree, Int)
-> (Int, Int) -> (ExprStmtTree, Int)
forall i e. Ix i => Array i e -> i -> e
! (Int
lo,Int
k), Array (Int, Int) (ExprStmtTree, Int)
arr Array (Int, Int) (ExprStmtTree, Int)
-> (Int, Int) -> (ExprStmtTree, Int)
forall i e. Ix i => Array i e -> i -> e
! (Int
kInt -> Int -> Int
forall a. Num a => a -> a -> a
+1,Int
hi))
                            | Int
k <- [Int
lo .. Int
hiInt -> Int -> Int
forall a. Num a => a -> a -> a
-1] ]


-- | Turn the ExprStmtTree back into a sequence of statements, using
-- ApplicativeStmt where necessary.
stmtTreeToStmts
  :: MonadNames
  -> HsStmtContext Name
  -> ExprStmtTree
  -> [ExprLStmt GhcRn]             -- ^ the "tail"
  -> FreeVars                     -- ^ free variables of the tail
  -> RnM ( [ExprLStmt GhcRn]       -- ( output statements,
         , FreeVars )             -- , things we needed

-- If we have a single bind, and we can do it without a join, transform
-- to an ApplicativeStmt.  This corresponds to the rule
--   dsBlock [pat <- rhs] (return expr) = expr <$> rhs
-- In the spec, but we do it here rather than in the desugarer,
-- because we need the typechecker to typecheck the <$> form rather than
-- the bind form, which would give rise to a Monad constraint.
stmtTreeToStmts :: MonadNames
-> HsStmtContext Name
-> ExprStmtTree
-> [LStmt GhcRn (LHsExpr GhcRn)]
-> FreeVars
-> RnM ([LStmt GhcRn (LHsExpr GhcRn)], FreeVars)
stmtTreeToStmts monad_names :: MonadNames
monad_names ctxt :: HsStmtContext Name
ctxt (StmtTreeOne (L _ (BindStmt _ pat :: LPat GhcRn
pat rhs :: LHsExpr GhcRn
rhs _ _), _))
                tail :: [LStmt GhcRn (LHsExpr GhcRn)]
tail _tail_fvs :: FreeVars
_tail_fvs
  | Bool -> Bool
not (LPat GhcRn -> Bool
forall (p :: Pass). LPat (GhcPass p) -> Bool
isStrictPattern LPat GhcRn
pat), (False,tail' :: [LStmt GhcRn (LHsExpr GhcRn)]
tail') <- MonadNames
-> [LStmt GhcRn (LHsExpr GhcRn)]
-> (Bool, [LStmt GhcRn (LHsExpr GhcRn)])
needJoin MonadNames
monad_names [LStmt GhcRn (LHsExpr GhcRn)]
tail
  -- See Note [ApplicativeDo and strict patterns]
  = HsStmtContext Name
-> [ApplicativeArg GhcRn]
-> Bool
-> [LStmt GhcRn (LHsExpr GhcRn)]
-> RnM ([LStmt GhcRn (LHsExpr GhcRn)], FreeVars)
mkApplicativeStmt HsStmtContext Name
ctxt [XApplicativeArgOne GhcRn
-> LPat GhcRn -> LHsExpr GhcRn -> Bool -> ApplicativeArg GhcRn
forall idL.
XApplicativeArgOne idL
-> LPat idL -> LHsExpr idL -> Bool -> ApplicativeArg idL
ApplicativeArgOne XApplicativeArgOne GhcRn
NoExt
noExt LPat GhcRn
pat LHsExpr GhcRn
rhs Bool
False] Bool
False [LStmt GhcRn (LHsExpr GhcRn)]
tail'
stmtTreeToStmts monad_names :: MonadNames
monad_names ctxt :: HsStmtContext Name
ctxt (StmtTreeOne (L _ (BodyStmt _ rhs :: LHsExpr GhcRn
rhs _ _),_))
                tail :: [LStmt GhcRn (LHsExpr GhcRn)]
tail _tail_fvs :: FreeVars
_tail_fvs
  | (False,tail' :: [LStmt GhcRn (LHsExpr GhcRn)]
tail') <- MonadNames
-> [LStmt GhcRn (LHsExpr GhcRn)]
-> (Bool, [LStmt GhcRn (LHsExpr GhcRn)])
needJoin MonadNames
monad_names [LStmt GhcRn (LHsExpr GhcRn)]
tail
  = HsStmtContext Name
-> [ApplicativeArg GhcRn]
-> Bool
-> [LStmt GhcRn (LHsExpr GhcRn)]
-> RnM ([LStmt GhcRn (LHsExpr GhcRn)], FreeVars)
mkApplicativeStmt HsStmtContext Name
ctxt
      [XApplicativeArgOne GhcRn
-> LPat GhcRn -> LHsExpr GhcRn -> Bool -> ApplicativeArg GhcRn
forall idL.
XApplicativeArgOne idL
-> LPat idL -> LHsExpr idL -> Bool -> ApplicativeArg idL
ApplicativeArgOne XApplicativeArgOne GhcRn
NoExt
noExt LPat GhcRn
nlWildPatName LHsExpr GhcRn
rhs Bool
True] Bool
False [LStmt GhcRn (LHsExpr GhcRn)]
tail'

stmtTreeToStmts _monad_names :: MonadNames
_monad_names _ctxt :: HsStmtContext Name
_ctxt (StmtTreeOne (s :: LStmt GhcRn (LHsExpr GhcRn)
s,_)) tail :: [LStmt GhcRn (LHsExpr GhcRn)]
tail _tail_fvs :: FreeVars
_tail_fvs =
  ([LStmt GhcRn (LHsExpr GhcRn)], FreeVars)
-> RnM ([LStmt GhcRn (LHsExpr GhcRn)], FreeVars)
forall (m :: * -> *) a. Monad m => a -> m a
return (LStmt GhcRn (LHsExpr GhcRn)
s LStmt GhcRn (LHsExpr GhcRn)
-> [LStmt GhcRn (LHsExpr GhcRn)] -> [LStmt GhcRn (LHsExpr GhcRn)]
forall a. a -> [a] -> [a]
: [LStmt GhcRn (LHsExpr GhcRn)]
tail, FreeVars
emptyNameSet)

stmtTreeToStmts monad_names :: MonadNames
monad_names ctxt :: HsStmtContext Name
ctxt (StmtTreeBind before :: ExprStmtTree
before after :: ExprStmtTree
after) tail :: [LStmt GhcRn (LHsExpr GhcRn)]
tail tail_fvs :: FreeVars
tail_fvs = do
  (stmts1 :: [LStmt GhcRn (LHsExpr GhcRn)]
stmts1, fvs1 :: FreeVars
fvs1) <- MonadNames
-> HsStmtContext Name
-> ExprStmtTree
-> [LStmt GhcRn (LHsExpr GhcRn)]
-> FreeVars
-> RnM ([LStmt GhcRn (LHsExpr GhcRn)], FreeVars)
stmtTreeToStmts MonadNames
monad_names HsStmtContext Name
ctxt ExprStmtTree
after [LStmt GhcRn (LHsExpr GhcRn)]
tail FreeVars
tail_fvs
  let tail1_fvs :: FreeVars
tail1_fvs = [FreeVars] -> FreeVars
unionNameSets (FreeVars
tail_fvs FreeVars -> [FreeVars] -> [FreeVars]
forall a. a -> [a] -> [a]
: ((LStmt GhcRn (LHsExpr GhcRn), FreeVars) -> FreeVars)
-> [(LStmt GhcRn (LHsExpr GhcRn), FreeVars)] -> [FreeVars]
forall a b. (a -> b) -> [a] -> [b]
map (LStmt GhcRn (LHsExpr GhcRn), FreeVars) -> FreeVars
forall a b. (a, b) -> b
snd (ExprStmtTree -> [(LStmt GhcRn (LHsExpr GhcRn), FreeVars)]
forall a. StmtTree a -> [a]
flattenStmtTree ExprStmtTree
after))
  (stmts2 :: [LStmt GhcRn (LHsExpr GhcRn)]
stmts2, fvs2 :: FreeVars
fvs2) <- MonadNames
-> HsStmtContext Name
-> ExprStmtTree
-> [LStmt GhcRn (LHsExpr GhcRn)]
-> FreeVars
-> RnM ([LStmt GhcRn (LHsExpr GhcRn)], FreeVars)
stmtTreeToStmts MonadNames
monad_names HsStmtContext Name
ctxt ExprStmtTree
before [LStmt GhcRn (LHsExpr GhcRn)]
stmts1 FreeVars
tail1_fvs
  ([LStmt GhcRn (LHsExpr GhcRn)], FreeVars)
-> RnM ([LStmt GhcRn (LHsExpr GhcRn)], FreeVars)
forall (m :: * -> *) a. Monad m => a -> m a
return ([LStmt GhcRn (LHsExpr GhcRn)]
stmts2, FreeVars
fvs1 FreeVars -> FreeVars -> FreeVars
`plusFV` FreeVars
fvs2)

stmtTreeToStmts monad_names :: MonadNames
monad_names ctxt :: HsStmtContext Name
ctxt (StmtTreeApplicative trees :: [ExprStmtTree]
trees) tail :: [LStmt GhcRn (LHsExpr GhcRn)]
tail tail_fvs :: FreeVars
tail_fvs = do
   [(ApplicativeArg GhcRn, FreeVars)]
pairs <- (ExprStmtTree
 -> IOEnv (Env TcGblEnv TcLclEnv) (ApplicativeArg GhcRn, FreeVars))
-> [ExprStmtTree]
-> IOEnv (Env TcGblEnv TcLclEnv) [(ApplicativeArg GhcRn, FreeVars)]
forall (t :: * -> *) (m :: * -> *) a b.
(Traversable t, Monad m) =>
(a -> m b) -> t a -> m (t b)
mapM (HsStmtContext Name
-> FreeVars
-> ExprStmtTree
-> IOEnv (Env TcGblEnv TcLclEnv) (ApplicativeArg GhcRn, FreeVars)
stmtTreeArg HsStmtContext Name
ctxt FreeVars
tail_fvs) [ExprStmtTree]
trees
   let (stmts' :: [ApplicativeArg GhcRn]
stmts', fvss :: [FreeVars]
fvss) = [(ApplicativeArg GhcRn, FreeVars)]
-> ([ApplicativeArg GhcRn], [FreeVars])
forall a b. [(a, b)] -> ([a], [b])
unzip [(ApplicativeArg GhcRn, FreeVars)]
pairs
   let (need_join :: Bool
need_join, tail' :: [LStmt GhcRn (LHsExpr GhcRn)]
tail') = MonadNames
-> [LStmt GhcRn (LHsExpr GhcRn)]
-> (Bool, [LStmt GhcRn (LHsExpr GhcRn)])
needJoin MonadNames
monad_names [LStmt GhcRn (LHsExpr GhcRn)]
tail
   (stmts :: [LStmt GhcRn (LHsExpr GhcRn)]
stmts, fvs :: FreeVars
fvs) <- HsStmtContext Name
-> [ApplicativeArg GhcRn]
-> Bool
-> [LStmt GhcRn (LHsExpr GhcRn)]
-> RnM ([LStmt GhcRn (LHsExpr GhcRn)], FreeVars)
mkApplicativeStmt HsStmtContext Name
ctxt [ApplicativeArg GhcRn]
stmts' Bool
need_join [LStmt GhcRn (LHsExpr GhcRn)]
tail'
   ([LStmt GhcRn (LHsExpr GhcRn)], FreeVars)
-> RnM ([LStmt GhcRn (LHsExpr GhcRn)], FreeVars)
forall (m :: * -> *) a. Monad m => a -> m a
return ([LStmt GhcRn (LHsExpr GhcRn)]
stmts, [FreeVars] -> FreeVars
unionNameSets (FreeVars
fvsFreeVars -> [FreeVars] -> [FreeVars]
forall a. a -> [a] -> [a]
:[FreeVars]
fvss))
 where
   stmtTreeArg :: HsStmtContext Name
-> FreeVars
-> ExprStmtTree
-> IOEnv (Env TcGblEnv TcLclEnv) (ApplicativeArg GhcRn, FreeVars)
stmtTreeArg _ctxt :: HsStmtContext Name
_ctxt _tail_fvs :: FreeVars
_tail_fvs (StmtTreeOne (L _ (BindStmt _ pat :: LPat GhcRn
pat exp :: LHsExpr GhcRn
exp _ _), _))
     = (ApplicativeArg GhcRn, FreeVars)
-> IOEnv (Env TcGblEnv TcLclEnv) (ApplicativeArg GhcRn, FreeVars)
forall (m :: * -> *) a. Monad m => a -> m a
return (XApplicativeArgOne GhcRn
-> LPat GhcRn -> LHsExpr GhcRn -> Bool -> ApplicativeArg GhcRn
forall idL.
XApplicativeArgOne idL
-> LPat idL -> LHsExpr idL -> Bool -> ApplicativeArg idL
ApplicativeArgOne XApplicativeArgOne GhcRn
NoExt
noExt LPat GhcRn
pat LHsExpr GhcRn
exp Bool
False, FreeVars
emptyFVs)
   stmtTreeArg _ctxt :: HsStmtContext Name
_ctxt _tail_fvs :: FreeVars
_tail_fvs (StmtTreeOne (L _ (BodyStmt _ exp :: LHsExpr GhcRn
exp _ _), _)) =
     (ApplicativeArg GhcRn, FreeVars)
-> IOEnv (Env TcGblEnv TcLclEnv) (ApplicativeArg GhcRn, FreeVars)
forall (m :: * -> *) a. Monad m => a -> m a
return (XApplicativeArgOne GhcRn
-> LPat GhcRn -> LHsExpr GhcRn -> Bool -> ApplicativeArg GhcRn
forall idL.
XApplicativeArgOne idL
-> LPat idL -> LHsExpr idL -> Bool -> ApplicativeArg idL
ApplicativeArgOne XApplicativeArgOne GhcRn
NoExt
noExt LPat GhcRn
nlWildPatName LHsExpr GhcRn
exp Bool
True, FreeVars
emptyFVs)
   stmtTreeArg ctxt :: HsStmtContext Name
ctxt tail_fvs :: FreeVars
tail_fvs tree :: ExprStmtTree
tree = do
     let stmts :: [(LStmt GhcRn (LHsExpr GhcRn), FreeVars)]
stmts = ExprStmtTree -> [(LStmt GhcRn (LHsExpr GhcRn), FreeVars)]
forall a. StmtTree a -> [a]
flattenStmtTree ExprStmtTree
tree
         pvarset :: FreeVars
pvarset = [Name] -> FreeVars
mkNameSet (((LStmt GhcRn (LHsExpr GhcRn), FreeVars) -> [Name])
-> [(LStmt GhcRn (LHsExpr GhcRn), FreeVars)] -> [Name]
forall (t :: * -> *) a b. Foldable t => (a -> [b]) -> t a -> [b]
concatMap (StmtLR GhcRn GhcRn (LHsExpr GhcRn) -> [Name]
forall (idL :: Pass) (idR :: Pass) body.
StmtLR (GhcPass idL) (GhcPass idR) body -> [IdP (GhcPass idL)]
collectStmtBinders(StmtLR GhcRn GhcRn (LHsExpr GhcRn) -> [Name])
-> ((LStmt GhcRn (LHsExpr GhcRn), FreeVars)
    -> StmtLR GhcRn GhcRn (LHsExpr GhcRn))
-> (LStmt GhcRn (LHsExpr GhcRn), FreeVars)
-> [Name]
forall b c a. (b -> c) -> (a -> b) -> a -> c
.LStmt GhcRn (LHsExpr GhcRn) -> StmtLR GhcRn GhcRn (LHsExpr GhcRn)
forall a. HasSrcSpan a => a -> SrcSpanLess a
unLoc(LStmt GhcRn (LHsExpr GhcRn) -> StmtLR GhcRn GhcRn (LHsExpr GhcRn))
-> ((LStmt GhcRn (LHsExpr GhcRn), FreeVars)
    -> LStmt GhcRn (LHsExpr GhcRn))
-> (LStmt GhcRn (LHsExpr GhcRn), FreeVars)
-> StmtLR GhcRn GhcRn (LHsExpr GhcRn)
forall b c a. (b -> c) -> (a -> b) -> a -> c
.(LStmt GhcRn (LHsExpr GhcRn), FreeVars)
-> LStmt GhcRn (LHsExpr GhcRn)
forall a b. (a, b) -> a
fst) [(LStmt GhcRn (LHsExpr GhcRn), FreeVars)]
stmts)
                     FreeVars -> FreeVars -> FreeVars
`intersectNameSet` FreeVars
tail_fvs
         pvars :: [Name]
pvars = FreeVars -> [Name]
nameSetElemsStable FreeVars
pvarset
           -- See Note [Deterministic ApplicativeDo and RecursiveDo desugaring]
         pat :: LPat GhcRn
pat = [IdP GhcRn] -> LPat GhcRn
mkBigLHsVarPatTup [Name]
[IdP GhcRn]
pvars
         tup :: LHsExpr GhcRn
tup = [IdP GhcRn] -> LHsExpr GhcRn
forall (id :: Pass). [IdP (GhcPass id)] -> LHsExpr (GhcPass id)
mkBigLHsVarTup [Name]
[IdP GhcRn]
pvars
     (stmts' :: [LStmt GhcRn (LHsExpr GhcRn)]
stmts',fvs2 :: FreeVars
fvs2) <- MonadNames
-> HsStmtContext Name
-> ExprStmtTree
-> [LStmt GhcRn (LHsExpr GhcRn)]
-> FreeVars
-> RnM ([LStmt GhcRn (LHsExpr GhcRn)], FreeVars)
stmtTreeToStmts MonadNames
monad_names HsStmtContext Name
ctxt ExprStmtTree
tree [] FreeVars
pvarset
     (mb_ret :: HsExpr GhcRn
mb_ret, fvs1 :: FreeVars
fvs1) <-
        if | L _ ApplicativeStmt{} <- [LStmt GhcRn (LHsExpr GhcRn)] -> LStmt GhcRn (LHsExpr GhcRn)
forall a. [a] -> a
last [LStmt GhcRn (LHsExpr GhcRn)]
stmts' ->
             (HsExpr GhcRn, FreeVars) -> RnM (HsExpr GhcRn, FreeVars)
forall (m :: * -> *) a. Monad m => a -> m a
return (LHsExpr GhcRn -> SrcSpanLess (LHsExpr GhcRn)
forall a. HasSrcSpan a => a -> SrcSpanLess a
unLoc LHsExpr GhcRn
tup, FreeVars
emptyNameSet)
           | Bool
otherwise -> do
             (ret :: HsExpr GhcRn
ret,fvs :: FreeVars
fvs) <- HsStmtContext Name -> Name -> RnM (HsExpr GhcRn, FreeVars)
lookupStmtNamePoly HsStmtContext Name
ctxt Name
returnMName
             (HsExpr GhcRn, FreeVars) -> RnM (HsExpr GhcRn, FreeVars)
forall (m :: * -> *) a. Monad m => a -> m a
return (XApp GhcRn -> LHsExpr GhcRn -> LHsExpr GhcRn -> HsExpr GhcRn
forall p. XApp p -> LHsExpr p -> LHsExpr p -> HsExpr p
HsApp XApp GhcRn
NoExt
noExt (SrcSpanLess (LHsExpr GhcRn) -> LHsExpr GhcRn
forall a. HasSrcSpan a => SrcSpanLess a -> a
noLoc SrcSpanLess (LHsExpr GhcRn)
HsExpr GhcRn
ret) LHsExpr GhcRn
tup, FreeVars
fvs)
     (ApplicativeArg GhcRn, FreeVars)
-> IOEnv (Env TcGblEnv TcLclEnv) (ApplicativeArg GhcRn, FreeVars)
forall (m :: * -> *) a. Monad m => a -> m a
return ( XApplicativeArgMany GhcRn
-> [LStmt GhcRn (LHsExpr GhcRn)]
-> HsExpr GhcRn
-> LPat GhcRn
-> ApplicativeArg GhcRn
forall idL.
XApplicativeArgMany idL
-> [ExprLStmt idL] -> HsExpr idL -> LPat idL -> ApplicativeArg idL
ApplicativeArgMany XApplicativeArgMany GhcRn
NoExt
noExt [LStmt GhcRn (LHsExpr GhcRn)]
stmts' HsExpr GhcRn
mb_ret LPat GhcRn
pat
            , FreeVars
fvs1 FreeVars -> FreeVars -> FreeVars
`plusFV` FreeVars
fvs2)


-- | Divide a sequence of statements into segments, where no segment
-- depends on any variables defined by a statement in another segment.
segments
  :: [(ExprLStmt GhcRn, FreeVars)]
  -> [[(ExprLStmt GhcRn, FreeVars)]]
segments :: [(LStmt GhcRn (LHsExpr GhcRn), FreeVars)]
-> [[(LStmt GhcRn (LHsExpr GhcRn), FreeVars)]]
segments stmts :: [(LStmt GhcRn (LHsExpr GhcRn), FreeVars)]
stmts = (([(LStmt GhcRn (LHsExpr GhcRn), FreeVars)], Bool)
 -> [(LStmt GhcRn (LHsExpr GhcRn), FreeVars)])
-> [([(LStmt GhcRn (LHsExpr GhcRn), FreeVars)], Bool)]
-> [[(LStmt GhcRn (LHsExpr GhcRn), FreeVars)]]
forall a b. (a -> b) -> [a] -> [b]
map ([(LStmt GhcRn (LHsExpr GhcRn), FreeVars)], Bool)
-> [(LStmt GhcRn (LHsExpr GhcRn), FreeVars)]
forall a b. (a, b) -> a
fst ([([(LStmt GhcRn (LHsExpr GhcRn), FreeVars)], Bool)]
 -> [[(LStmt GhcRn (LHsExpr GhcRn), FreeVars)]])
-> [([(LStmt GhcRn (LHsExpr GhcRn), FreeVars)], Bool)]
-> [[(LStmt GhcRn (LHsExpr GhcRn), FreeVars)]]
forall a b. (a -> b) -> a -> b
$ [[(LStmt GhcRn (LHsExpr GhcRn), FreeVars)]]
-> [([(LStmt GhcRn (LHsExpr GhcRn), FreeVars)], Bool)]
forall a b b. [[(LStmt a b, b)]] -> [([(LStmt a b, b)], Bool)]
merge ([[(LStmt GhcRn (LHsExpr GhcRn), FreeVars)]]
 -> [([(LStmt GhcRn (LHsExpr GhcRn), FreeVars)], Bool)])
-> [[(LStmt GhcRn (LHsExpr GhcRn), FreeVars)]]
-> [([(LStmt GhcRn (LHsExpr GhcRn), FreeVars)], Bool)]
forall a b. (a -> b) -> a -> b
$ [[(LStmt GhcRn (LHsExpr GhcRn), FreeVars)]]
-> [[(LStmt GhcRn (LHsExpr GhcRn), FreeVars)]]
forall a. [a] -> [a]
reverse ([[(LStmt GhcRn (LHsExpr GhcRn), FreeVars)]]
 -> [[(LStmt GhcRn (LHsExpr GhcRn), FreeVars)]])
-> [[(LStmt GhcRn (LHsExpr GhcRn), FreeVars)]]
-> [[(LStmt GhcRn (LHsExpr GhcRn), FreeVars)]]
forall a b. (a -> b) -> a -> b
$ ([(LStmt GhcRn (LHsExpr GhcRn), FreeVars)]
 -> [(LStmt GhcRn (LHsExpr GhcRn), FreeVars)])
-> [[(LStmt GhcRn (LHsExpr GhcRn), FreeVars)]]
-> [[(LStmt GhcRn (LHsExpr GhcRn), FreeVars)]]
forall a b. (a -> b) -> [a] -> [b]
map [(LStmt GhcRn (LHsExpr GhcRn), FreeVars)]
-> [(LStmt GhcRn (LHsExpr GhcRn), FreeVars)]
forall a. [a] -> [a]
reverse ([[(LStmt GhcRn (LHsExpr GhcRn), FreeVars)]]
 -> [[(LStmt GhcRn (LHsExpr GhcRn), FreeVars)]])
-> [[(LStmt GhcRn (LHsExpr GhcRn), FreeVars)]]
-> [[(LStmt GhcRn (LHsExpr GhcRn), FreeVars)]]
forall a b. (a -> b) -> a -> b
$ [(LStmt GhcRn (LHsExpr GhcRn), FreeVars)]
-> [[(LStmt GhcRn (LHsExpr GhcRn), FreeVars)]]
walk ([(LStmt GhcRn (LHsExpr GhcRn), FreeVars)]
-> [(LStmt GhcRn (LHsExpr GhcRn), FreeVars)]
forall a. [a] -> [a]
reverse [(LStmt GhcRn (LHsExpr GhcRn), FreeVars)]
stmts)
  where
    allvars :: FreeVars
allvars = [Name] -> FreeVars
mkNameSet (((LStmt GhcRn (LHsExpr GhcRn), FreeVars) -> [Name])
-> [(LStmt GhcRn (LHsExpr GhcRn), FreeVars)] -> [Name]
forall (t :: * -> *) a b. Foldable t => (a -> [b]) -> t a -> [b]
concatMap (StmtLR GhcRn GhcRn (LHsExpr GhcRn) -> [Name]
forall (idL :: Pass) (idR :: Pass) body.
StmtLR (GhcPass idL) (GhcPass idR) body -> [IdP (GhcPass idL)]
collectStmtBinders(StmtLR GhcRn GhcRn (LHsExpr GhcRn) -> [Name])
-> ((LStmt GhcRn (LHsExpr GhcRn), FreeVars)
    -> StmtLR GhcRn GhcRn (LHsExpr GhcRn))
-> (LStmt GhcRn (LHsExpr GhcRn), FreeVars)
-> [Name]
forall b c a. (b -> c) -> (a -> b) -> a -> c
.LStmt GhcRn (LHsExpr GhcRn) -> StmtLR GhcRn GhcRn (LHsExpr GhcRn)
forall a. HasSrcSpan a => a -> SrcSpanLess a
unLoc(LStmt GhcRn (LHsExpr GhcRn) -> StmtLR GhcRn GhcRn (LHsExpr GhcRn))
-> ((LStmt GhcRn (LHsExpr GhcRn), FreeVars)
    -> LStmt GhcRn (LHsExpr GhcRn))
-> (LStmt GhcRn (LHsExpr GhcRn), FreeVars)
-> StmtLR GhcRn GhcRn (LHsExpr GhcRn)
forall b c a. (b -> c) -> (a -> b) -> a -> c
.(LStmt GhcRn (LHsExpr GhcRn), FreeVars)
-> LStmt GhcRn (LHsExpr GhcRn)
forall a b. (a, b) -> a
fst) [(LStmt GhcRn (LHsExpr GhcRn), FreeVars)]
stmts)

    -- We would rather not have a segment that just has LetStmts in
    -- it, so combine those with an adjacent segment where possible.
    merge :: [[(LStmt a b, b)]] -> [([(LStmt a b, b)], Bool)]
merge [] = []
    merge (seg :: [(LStmt a b, b)]
seg : segs :: [[(LStmt a b, b)]]
segs)
       = case [([(LStmt a b, b)], Bool)]
rest of
          [] -> [([(LStmt a b, b)]
seg,Bool
all_lets)]
          ((s :: [(LStmt a b, b)]
s,s_lets :: Bool
s_lets):ss :: [([(LStmt a b, b)], Bool)]
ss) | Bool
all_lets Bool -> Bool -> Bool
|| Bool
s_lets
               -> ([(LStmt a b, b)]
seg [(LStmt a b, b)] -> [(LStmt a b, b)] -> [(LStmt a b, b)]
forall a. [a] -> [a] -> [a]
++ [(LStmt a b, b)]
s, Bool
all_lets Bool -> Bool -> Bool
&& Bool
s_lets) ([(LStmt a b, b)], Bool)
-> [([(LStmt a b, b)], Bool)] -> [([(LStmt a b, b)], Bool)]
forall a. a -> [a] -> [a]
: [([(LStmt a b, b)], Bool)]
ss
          _otherwise :: [([(LStmt a b, b)], Bool)]
_otherwise -> ([(LStmt a b, b)]
seg,Bool
all_lets) ([(LStmt a b, b)], Bool)
-> [([(LStmt a b, b)], Bool)] -> [([(LStmt a b, b)], Bool)]
forall a. a -> [a] -> [a]
: [([(LStmt a b, b)], Bool)]
rest
      where
        rest :: [([(LStmt a b, b)], Bool)]
rest = [[(LStmt a b, b)]] -> [([(LStmt a b, b)], Bool)]
merge [[(LStmt a b, b)]]
segs
        all_lets :: Bool
all_lets = ((LStmt a b, b) -> Bool) -> [(LStmt a b, b)] -> Bool
forall (t :: * -> *) a. Foldable t => (a -> Bool) -> t a -> Bool
all (LStmt a b -> Bool
forall a b. LStmt a b -> Bool
isLetStmt (LStmt a b -> Bool)
-> ((LStmt a b, b) -> LStmt a b) -> (LStmt a b, b) -> Bool
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (LStmt a b, b) -> LStmt a b
forall a b. (a, b) -> a
fst) [(LStmt a b, b)]
seg

    -- walk splits the statement sequence into segments, traversing
    -- the sequence from the back to the front, and keeping track of
    -- the set of free variables of the current segment.  Whenever
    -- this set of free variables is empty, we have a complete segment.
    walk :: [(ExprLStmt GhcRn, FreeVars)] -> [[(ExprLStmt GhcRn, FreeVars)]]
    walk :: [(LStmt GhcRn (LHsExpr GhcRn), FreeVars)]
-> [[(LStmt GhcRn (LHsExpr GhcRn), FreeVars)]]
walk [] = []
    walk ((stmt :: LStmt GhcRn (LHsExpr GhcRn)
stmt,fvs :: FreeVars
fvs) : stmts :: [(LStmt GhcRn (LHsExpr GhcRn), FreeVars)]
stmts) = ((LStmt GhcRn (LHsExpr GhcRn)
stmt,FreeVars
fvs) (LStmt GhcRn (LHsExpr GhcRn), FreeVars)
-> [(LStmt GhcRn (LHsExpr GhcRn), FreeVars)]
-> [(LStmt GhcRn (LHsExpr GhcRn), FreeVars)]
forall a. a -> [a] -> [a]
: [(LStmt GhcRn (LHsExpr GhcRn), FreeVars)]
seg) [(LStmt GhcRn (LHsExpr GhcRn), FreeVars)]
-> [[(LStmt GhcRn (LHsExpr GhcRn), FreeVars)]]
-> [[(LStmt GhcRn (LHsExpr GhcRn), FreeVars)]]
forall a. a -> [a] -> [a]
: [(LStmt GhcRn (LHsExpr GhcRn), FreeVars)]
-> [[(LStmt GhcRn (LHsExpr GhcRn), FreeVars)]]
walk [(LStmt GhcRn (LHsExpr GhcRn), FreeVars)]
rest
      where (seg :: [(LStmt GhcRn (LHsExpr GhcRn), FreeVars)]
seg,rest :: [(LStmt GhcRn (LHsExpr GhcRn), FreeVars)]
rest) = FreeVars
-> [(LStmt GhcRn (LHsExpr GhcRn), FreeVars)]
-> ([(LStmt GhcRn (LHsExpr GhcRn), FreeVars)],
    [(LStmt GhcRn (LHsExpr GhcRn), FreeVars)])
chunter FreeVars
fvs' [(LStmt GhcRn (LHsExpr GhcRn), FreeVars)]
stmts
            (_, fvs' :: FreeVars
fvs') = LStmt GhcRn (LHsExpr GhcRn) -> FreeVars -> (FreeVars, FreeVars)
stmtRefs LStmt GhcRn (LHsExpr GhcRn)
stmt FreeVars
fvs

    chunter :: FreeVars
-> [(LStmt GhcRn (LHsExpr GhcRn), FreeVars)]
-> ([(LStmt GhcRn (LHsExpr GhcRn), FreeVars)],
    [(LStmt GhcRn (LHsExpr GhcRn), FreeVars)])
chunter _ [] = ([], [])
    chunter vars :: FreeVars
vars ((stmt :: LStmt GhcRn (LHsExpr GhcRn)
stmt,fvs :: FreeVars
fvs) : rest :: [(LStmt GhcRn (LHsExpr GhcRn), FreeVars)]
rest)
       | Bool -> Bool
not (FreeVars -> Bool
isEmptyNameSet FreeVars
vars)
       Bool -> Bool -> Bool
|| LStmt GhcRn (LHsExpr GhcRn) -> Bool
isStrictPatternBind LStmt GhcRn (LHsExpr GhcRn)
stmt
           -- See Note [ApplicativeDo and strict patterns]
       = ((LStmt GhcRn (LHsExpr GhcRn)
stmt,FreeVars
fvs) (LStmt GhcRn (LHsExpr GhcRn), FreeVars)
-> [(LStmt GhcRn (LHsExpr GhcRn), FreeVars)]
-> [(LStmt GhcRn (LHsExpr GhcRn), FreeVars)]
forall a. a -> [a] -> [a]
: [(LStmt GhcRn (LHsExpr GhcRn), FreeVars)]
chunk, [(LStmt GhcRn (LHsExpr GhcRn), FreeVars)]
rest')
       where (chunk :: [(LStmt GhcRn (LHsExpr GhcRn), FreeVars)]
chunk,rest' :: [(LStmt GhcRn (LHsExpr GhcRn), FreeVars)]
rest') = FreeVars
-> [(LStmt GhcRn (LHsExpr GhcRn), FreeVars)]
-> ([(LStmt GhcRn (LHsExpr GhcRn), FreeVars)],
    [(LStmt GhcRn (LHsExpr GhcRn), FreeVars)])
chunter FreeVars
vars' [(LStmt GhcRn (LHsExpr GhcRn), FreeVars)]
rest
             (pvars :: FreeVars
pvars, evars :: FreeVars
evars) = LStmt GhcRn (LHsExpr GhcRn) -> FreeVars -> (FreeVars, FreeVars)
stmtRefs LStmt GhcRn (LHsExpr GhcRn)
stmt FreeVars
fvs
             vars' :: FreeVars
vars' = (FreeVars
vars FreeVars -> FreeVars -> FreeVars
`minusNameSet` FreeVars
pvars) FreeVars -> FreeVars -> FreeVars
`unionNameSet` FreeVars
evars
    chunter _ rest :: [(LStmt GhcRn (LHsExpr GhcRn), FreeVars)]
rest = ([], [(LStmt GhcRn (LHsExpr GhcRn), FreeVars)]
rest)

    stmtRefs :: LStmt GhcRn (LHsExpr GhcRn) -> FreeVars -> (FreeVars, FreeVars)
stmtRefs stmt :: LStmt GhcRn (LHsExpr GhcRn)
stmt fvs :: FreeVars
fvs
      | LStmt GhcRn (LHsExpr GhcRn) -> Bool
forall a b. LStmt a b -> Bool
isLetStmt LStmt GhcRn (LHsExpr GhcRn)
stmt = (FreeVars
pvars, FreeVars
fvs' FreeVars -> FreeVars -> FreeVars
`minusNameSet` FreeVars
pvars)
      | Bool
otherwise      = (FreeVars
pvars, FreeVars
fvs')
      where fvs' :: FreeVars
fvs' = FreeVars
fvs FreeVars -> FreeVars -> FreeVars
`intersectNameSet` FreeVars
allvars
            pvars :: FreeVars
pvars = [Name] -> FreeVars
mkNameSet (StmtLR GhcRn GhcRn (LHsExpr GhcRn) -> [IdP GhcRn]
forall (idL :: Pass) (idR :: Pass) body.
StmtLR (GhcPass idL) (GhcPass idR) body -> [IdP (GhcPass idL)]
collectStmtBinders (LStmt GhcRn (LHsExpr GhcRn)
-> SrcSpanLess (LStmt GhcRn (LHsExpr GhcRn))
forall a. HasSrcSpan a => a -> SrcSpanLess a
unLoc LStmt GhcRn (LHsExpr GhcRn)
stmt))

    isStrictPatternBind :: ExprLStmt GhcRn -> Bool
    isStrictPatternBind :: LStmt GhcRn (LHsExpr GhcRn) -> Bool
isStrictPatternBind (L _ (BindStmt _ pat :: LPat GhcRn
pat _ _ _)) = LPat GhcRn -> Bool
forall (p :: Pass). LPat (GhcPass p) -> Bool
isStrictPattern LPat GhcRn
pat
    isStrictPatternBind _ = Bool
False

{-
Note [ApplicativeDo and strict patterns]

A strict pattern match is really a dependency.  For example,

do
  (x,y) <- A
  z <- B
  return C

The pattern (_,_) must be matched strictly before we do B.  If we
allowed this to be transformed into

  (\(x,y) -> \z -> C) <$> A <*> B

then it could be lazier than the standard desuraging using >>=.  See #13875
for more examples.

Thus, whenever we have a strict pattern match, we treat it as a
dependency between that statement and the following one.  The
dependency prevents those two statements from being performed "in
parallel" in an ApplicativeStmt, but doesn't otherwise affect what we
can do with the rest of the statements in the same "do" expression.
-}

isStrictPattern :: LPat (GhcPass p) -> Bool
isStrictPattern :: LPat (GhcPass p) -> Bool
isStrictPattern lpat :: LPat (GhcPass p)
lpat =
  case LPat (GhcPass p) -> SrcSpanLess (LPat (GhcPass p))
forall a. HasSrcSpan a => a -> SrcSpanLess a
unLoc LPat (GhcPass p)
lpat of
    WildPat{}       -> Bool
False
    VarPat{}        -> Bool
False
    LazyPat{}       -> Bool
False
    AsPat _ _ p     -> LPat (GhcPass p) -> Bool
forall (p :: Pass). LPat (GhcPass p) -> Bool
isStrictPattern LPat (GhcPass p)
p
    ParPat _ p      -> LPat (GhcPass p) -> Bool
forall (p :: Pass). LPat (GhcPass p) -> Bool
isStrictPattern LPat (GhcPass p)
p
    ViewPat _ _ p   -> LPat (GhcPass p) -> Bool
forall (p :: Pass). LPat (GhcPass p) -> Bool
isStrictPattern LPat (GhcPass p)
p
    SigPat _ p _    -> LPat (GhcPass p) -> Bool
forall (p :: Pass). LPat (GhcPass p) -> Bool
isStrictPattern LPat (GhcPass p)
p
    BangPat{}       -> Bool
True
    ListPat{}       -> Bool
True
    TuplePat{}      -> Bool
True
    SumPat{}        -> Bool
True
    ConPatIn{}      -> Bool
True
    ConPatOut{}     -> Bool
True
    LitPat{}        -> Bool
True
    NPat{}          -> Bool
True
    NPlusKPat{}     -> Bool
True
    SplicePat{}     -> Bool
True
    _otherwise :: SrcSpanLess (LPat (GhcPass p))
_otherwise -> String -> Bool
forall a. String -> a
panic "isStrictPattern"

isLetStmt :: LStmt a b -> Bool
isLetStmt :: LStmt a b -> Bool
isLetStmt (L _ LetStmt{}) = Bool
True
isLetStmt _ = Bool
False

-- | Find a "good" place to insert a bind in an indivisible segment.
-- This is the only place where we use heuristics.  The current
-- heuristic is to peel off the first group of independent statements
-- and put the bind after those.
splitSegment
  :: [(ExprLStmt GhcRn, FreeVars)]
  -> ( [(ExprLStmt GhcRn, FreeVars)]
     , [(ExprLStmt GhcRn, FreeVars)] )
splitSegment :: [(LStmt GhcRn (LHsExpr GhcRn), FreeVars)]
-> ([(LStmt GhcRn (LHsExpr GhcRn), FreeVars)],
    [(LStmt GhcRn (LHsExpr GhcRn), FreeVars)])
splitSegment [one :: (LStmt GhcRn (LHsExpr GhcRn), FreeVars)
one,two :: (LStmt GhcRn (LHsExpr GhcRn), FreeVars)
two] = ([(LStmt GhcRn (LHsExpr GhcRn), FreeVars)
one],[(LStmt GhcRn (LHsExpr GhcRn), FreeVars)
two])
  -- there is no choice when there are only two statements; this just saves
  -- some work in a common case.
splitSegment stmts :: [(LStmt GhcRn (LHsExpr GhcRn), FreeVars)]
stmts
  | Just (lets :: [(LStmt GhcRn (LHsExpr GhcRn), FreeVars)]
lets,binds :: [(LStmt GhcRn (LHsExpr GhcRn), FreeVars)]
binds,rest :: [(LStmt GhcRn (LHsExpr GhcRn), FreeVars)]
rest) <- [(LStmt GhcRn (LHsExpr GhcRn), FreeVars)]
-> Maybe
     ([(LStmt GhcRn (LHsExpr GhcRn), FreeVars)],
      [(LStmt GhcRn (LHsExpr GhcRn), FreeVars)],
      [(LStmt GhcRn (LHsExpr GhcRn), FreeVars)])
forall (body :: * -> *).
[(LStmt GhcRn (Located (body GhcRn)), FreeVars)]
-> Maybe
     ([(LStmt GhcRn (Located (body GhcRn)), FreeVars)],
      [(LStmt GhcRn (Located (body GhcRn)), FreeVars)],
      [(LStmt GhcRn (Located (body GhcRn)), FreeVars)])
slurpIndependentStmts [(LStmt GhcRn (LHsExpr GhcRn), FreeVars)]
stmts
  =  if Bool -> Bool
not ([(LStmt GhcRn (LHsExpr GhcRn), FreeVars)] -> Bool
forall (t :: * -> *) a. Foldable t => t a -> Bool
null [(LStmt GhcRn (LHsExpr GhcRn), FreeVars)]
lets)
       then ([(LStmt GhcRn (LHsExpr GhcRn), FreeVars)]
lets, [(LStmt GhcRn (LHsExpr GhcRn), FreeVars)]
binds[(LStmt GhcRn (LHsExpr GhcRn), FreeVars)]
-> [(LStmt GhcRn (LHsExpr GhcRn), FreeVars)]
-> [(LStmt GhcRn (LHsExpr GhcRn), FreeVars)]
forall a. [a] -> [a] -> [a]
++[(LStmt GhcRn (LHsExpr GhcRn), FreeVars)]
rest)
       else ([(LStmt GhcRn (LHsExpr GhcRn), FreeVars)]
lets[(LStmt GhcRn (LHsExpr GhcRn), FreeVars)]
-> [(LStmt GhcRn (LHsExpr GhcRn), FreeVars)]
-> [(LStmt GhcRn (LHsExpr GhcRn), FreeVars)]
forall a. [a] -> [a] -> [a]
++[(LStmt GhcRn (LHsExpr GhcRn), FreeVars)]
binds, [(LStmt GhcRn (LHsExpr GhcRn), FreeVars)]
rest)
  | Bool
otherwise
  = case [(LStmt GhcRn (LHsExpr GhcRn), FreeVars)]
stmts of
      (x :: (LStmt GhcRn (LHsExpr GhcRn), FreeVars)
x:xs :: [(LStmt GhcRn (LHsExpr GhcRn), FreeVars)]
xs) -> ([(LStmt GhcRn (LHsExpr GhcRn), FreeVars)
x],[(LStmt GhcRn (LHsExpr GhcRn), FreeVars)]
xs)
      _other :: [(LStmt GhcRn (LHsExpr GhcRn), FreeVars)]
_other -> ([(LStmt GhcRn (LHsExpr GhcRn), FreeVars)]
stmts,[])

slurpIndependentStmts
   :: [(LStmt GhcRn (Located (body GhcRn)), FreeVars)]
   -> Maybe ( [(LStmt GhcRn (Located (body GhcRn)), FreeVars)] -- LetStmts
            , [(LStmt GhcRn (Located (body GhcRn)), FreeVars)] -- BindStmts
            , [(LStmt GhcRn (Located (body GhcRn)), FreeVars)] )
slurpIndependentStmts :: [(LStmt GhcRn (Located (body GhcRn)), FreeVars)]
-> Maybe
     ([(LStmt GhcRn (Located (body GhcRn)), FreeVars)],
      [(LStmt GhcRn (Located (body GhcRn)), FreeVars)],
      [(LStmt GhcRn (Located (body GhcRn)), FreeVars)])
slurpIndependentStmts stmts :: [(LStmt GhcRn (Located (body GhcRn)), FreeVars)]
stmts = [(LStmt GhcRn (Located (body GhcRn)), FreeVars)]
-> [(LStmt GhcRn (Located (body GhcRn)), FreeVars)]
-> FreeVars
-> [(LStmt GhcRn (Located (body GhcRn)), FreeVars)]
-> Maybe
     ([(LStmt GhcRn (Located (body GhcRn)), FreeVars)],
      [(LStmt GhcRn (Located (body GhcRn)), FreeVars)],
      [(LStmt GhcRn (Located (body GhcRn)), FreeVars)])
forall (p :: Pass) idR body body l.
(IdP (GhcPass p) ~ Name, XBindStmt (GhcPass p) idR body ~ NoExt,
 XLetStmt (GhcPass p) idR body ~ XLetStmt (GhcPass p) idR body) =>
[(GenLocated l (StmtLR (GhcPass p) idR body), FreeVars)]
-> [(GenLocated l (StmtLR (GhcPass p) idR body), FreeVars)]
-> FreeVars
-> [(GenLocated l (StmtLR (GhcPass p) idR body), FreeVars)]
-> Maybe
     ([(GenLocated l (StmtLR (GhcPass p) idR body), FreeVars)],
      [(GenLocated l (StmtLR (GhcPass p) idR body), FreeVars)],
      [(GenLocated l (StmtLR (GhcPass p) idR body), FreeVars)])
go [] [] FreeVars
emptyNameSet [(LStmt GhcRn (Located (body GhcRn)), FreeVars)]
stmts
 where
  -- If we encounter a BindStmt that doesn't depend on a previous BindStmt
  -- in this group, then add it to the group. We have to be careful about
  -- strict patterns though; splitSegments expects that if we return Just
  -- then we have actually done some splitting. Otherwise it will go into
  -- an infinite loop (#14163).
  go :: [(GenLocated l (StmtLR (GhcPass p) idR body), FreeVars)]
-> [(GenLocated l (StmtLR (GhcPass p) idR body), FreeVars)]
-> FreeVars
-> [(GenLocated l (StmtLR (GhcPass p) idR body), FreeVars)]
-> Maybe
     ([(GenLocated l (StmtLR (GhcPass p) idR body), FreeVars)],
      [(GenLocated l (StmtLR (GhcPass p) idR body), FreeVars)],
      [(GenLocated l (StmtLR (GhcPass p) idR body), FreeVars)])
go lets :: [(GenLocated l (StmtLR (GhcPass p) idR body), FreeVars)]
lets indep :: [(GenLocated l (StmtLR (GhcPass p) idR body), FreeVars)]
indep bndrs :: FreeVars
bndrs ((L loc :: l
loc (BindStmt _ pat :: LPat (GhcPass p)
pat body :: body
body bind_op :: SyntaxExpr idR
bind_op fail_op :: SyntaxExpr idR
fail_op), fvs :: FreeVars
fvs): rest :: [(GenLocated l (StmtLR (GhcPass p) idR body), FreeVars)]
rest)
    | FreeVars -> Bool
isEmptyNameSet (FreeVars
bndrs FreeVars -> FreeVars -> FreeVars
`intersectNameSet` FreeVars
fvs) Bool -> Bool -> Bool
&& Bool -> Bool
not (LPat (GhcPass p) -> Bool
forall (p :: Pass). LPat (GhcPass p) -> Bool
isStrictPattern LPat (GhcPass p)
pat)
    = [(GenLocated l (StmtLR (GhcPass p) idR body), FreeVars)]
-> [(GenLocated l (StmtLR (GhcPass p) idR body), FreeVars)]
-> FreeVars
-> [(GenLocated l (StmtLR (GhcPass p) idR body), FreeVars)]
-> Maybe
     ([(GenLocated l (StmtLR (GhcPass p) idR body), FreeVars)],
      [(GenLocated l (StmtLR (GhcPass p) idR body), FreeVars)],
      [(GenLocated l (StmtLR (GhcPass p) idR body), FreeVars)])
go [(GenLocated l (StmtLR (GhcPass p) idR body), FreeVars)]
lets ((l
-> StmtLR (GhcPass p) idR body
-> GenLocated l (StmtLR (GhcPass p) idR body)
forall l e. l -> e -> GenLocated l e
L l
loc (XBindStmt (GhcPass p) idR body
-> LPat (GhcPass p)
-> body
-> SyntaxExpr idR
-> SyntaxExpr idR
-> StmtLR (GhcPass p) idR body
forall idL idR body.
XBindStmt idL idR body
-> LPat idL
-> body
-> SyntaxExpr idR
-> SyntaxExpr idR
-> StmtLR idL idR body
BindStmt XBindStmt (GhcPass p) idR body
NoExt
noExt LPat (GhcPass p)
pat body
body SyntaxExpr idR
bind_op SyntaxExpr idR
fail_op), FreeVars
fvs) (GenLocated l (StmtLR (GhcPass p) idR body), FreeVars)
-> [(GenLocated l (StmtLR (GhcPass p) idR body), FreeVars)]
-> [(GenLocated l (StmtLR (GhcPass p) idR body), FreeVars)]
forall a. a -> [a] -> [a]
: [(GenLocated l (StmtLR (GhcPass p) idR body), FreeVars)]
indep)
         FreeVars
bndrs' [(GenLocated l (StmtLR (GhcPass p) idR body), FreeVars)]
rest
    where bndrs' :: FreeVars
bndrs' = FreeVars
bndrs FreeVars -> FreeVars -> FreeVars
`unionNameSet` [Name] -> FreeVars
mkNameSet (LPat (GhcPass p) -> [IdP (GhcPass p)]
forall (p :: Pass). LPat (GhcPass p) -> [IdP (GhcPass p)]
collectPatBinders LPat (GhcPass p)
pat)
  -- If we encounter a LetStmt that doesn't depend on a BindStmt in this
  -- group, then move it to the beginning, so that it doesn't interfere with
  -- grouping more BindStmts.
  -- TODO: perhaps we shouldn't do this if there are any strict bindings,
  -- because we might be moving evaluation earlier.
  go lets :: [(GenLocated l (StmtLR (GhcPass p) idR body), FreeVars)]
lets indep :: [(GenLocated l (StmtLR (GhcPass p) idR body), FreeVars)]
indep bndrs :: FreeVars
bndrs ((L loc :: l
loc (LetStmt noExt :: XLetStmt (GhcPass p) idR body
noExt binds :: LHsLocalBindsLR (GhcPass p) idR
binds), fvs :: FreeVars
fvs) : rest :: [(GenLocated l (StmtLR (GhcPass p) idR body), FreeVars)]
rest)
    | FreeVars -> Bool
isEmptyNameSet (FreeVars
bndrs FreeVars -> FreeVars -> FreeVars
`intersectNameSet` FreeVars
fvs)
    = [(GenLocated l (StmtLR (GhcPass p) idR body), FreeVars)]
-> [(GenLocated l (StmtLR (GhcPass p) idR body), FreeVars)]
-> FreeVars
-> [(GenLocated l (StmtLR (GhcPass p) idR body), FreeVars)]
-> Maybe
     ([(GenLocated l (StmtLR (GhcPass p) idR body), FreeVars)],
      [(GenLocated l (StmtLR (GhcPass p) idR body), FreeVars)],
      [(GenLocated l (StmtLR (GhcPass p) idR body), FreeVars)])
go ((l
-> StmtLR (GhcPass p) idR body
-> GenLocated l (StmtLR (GhcPass p) idR body)
forall l e. l -> e -> GenLocated l e
L l
loc (XLetStmt (GhcPass p) idR body
-> LHsLocalBindsLR (GhcPass p) idR -> StmtLR (GhcPass p) idR body
forall idL idR body.
XLetStmt idL idR body
-> LHsLocalBindsLR idL idR -> StmtLR idL idR body
LetStmt XLetStmt (GhcPass p) idR body
XLetStmt (GhcPass p) idR body
noExt LHsLocalBindsLR (GhcPass p) idR
binds), FreeVars
fvs) (GenLocated l (StmtLR (GhcPass p) idR body), FreeVars)
-> [(GenLocated l (StmtLR (GhcPass p) idR body), FreeVars)]
-> [(GenLocated l (StmtLR (GhcPass p) idR body), FreeVars)]
forall a. a -> [a] -> [a]
: [(GenLocated l (StmtLR (GhcPass p) idR body), FreeVars)]
lets) [(GenLocated l (StmtLR (GhcPass p) idR body), FreeVars)]
indep FreeVars
bndrs [(GenLocated l (StmtLR (GhcPass p) idR body), FreeVars)]
rest
  go _ []  _ _ = Maybe
  ([(GenLocated l (StmtLR (GhcPass p) idR body), FreeVars)],
   [(GenLocated l (StmtLR (GhcPass p) idR body), FreeVars)],
   [(GenLocated l (StmtLR (GhcPass p) idR body), FreeVars)])
forall a. Maybe a
Nothing
  go _ [_] _ _ = Maybe
  ([(GenLocated l (StmtLR (GhcPass p) idR body), FreeVars)],
   [(GenLocated l (StmtLR (GhcPass p) idR body), FreeVars)],
   [(GenLocated l (StmtLR (GhcPass p) idR body), FreeVars)])
forall a. Maybe a
Nothing
  go lets :: [(GenLocated l (StmtLR (GhcPass p) idR body), FreeVars)]
lets indep :: [(GenLocated l (StmtLR (GhcPass p) idR body), FreeVars)]
indep _ stmts :: [(GenLocated l (StmtLR (GhcPass p) idR body), FreeVars)]
stmts = ([(GenLocated l (StmtLR (GhcPass p) idR body), FreeVars)],
 [(GenLocated l (StmtLR (GhcPass p) idR body), FreeVars)],
 [(GenLocated l (StmtLR (GhcPass p) idR body), FreeVars)])
-> Maybe
     ([(GenLocated l (StmtLR (GhcPass p) idR body), FreeVars)],
      [(GenLocated l (StmtLR (GhcPass p) idR body), FreeVars)],
      [(GenLocated l (StmtLR (GhcPass p) idR body), FreeVars)])
forall a. a -> Maybe a
Just ([(GenLocated l (StmtLR (GhcPass p) idR body), FreeVars)]
-> [(GenLocated l (StmtLR (GhcPass p) idR body), FreeVars)]
forall a. [a] -> [a]
reverse [(GenLocated l (StmtLR (GhcPass p) idR body), FreeVars)]
lets, [(GenLocated l (StmtLR (GhcPass p) idR body), FreeVars)]
-> [(GenLocated l (StmtLR (GhcPass p) idR body), FreeVars)]
forall a. [a] -> [a]
reverse [(GenLocated l (StmtLR (GhcPass p) idR body), FreeVars)]
indep, [(GenLocated l (StmtLR (GhcPass p) idR body), FreeVars)]
stmts)

-- | Build an ApplicativeStmt, and strip the "return" from the tail
-- if necessary.
--
-- For example, if we start with
--   do x <- E1; y <- E2; return (f x y)
-- then we get
--   do (E1[x] | E2[y]); f x y
--
-- the LastStmt in this case has the return removed, but we set the
-- flag on the LastStmt to indicate this, so that we can print out the
-- original statement correctly in error messages.  It is easier to do
-- it this way rather than try to ignore the return later in both the
-- typechecker and the desugarer (I tried it that way first!).
mkApplicativeStmt
  :: HsStmtContext Name
  -> [ApplicativeArg GhcRn]             -- ^ The args
  -> Bool                               -- ^ True <=> need a join
  -> [ExprLStmt GhcRn]        -- ^ The body statements
  -> RnM ([ExprLStmt GhcRn], FreeVars)
mkApplicativeStmt :: HsStmtContext Name
-> [ApplicativeArg GhcRn]
-> Bool
-> [LStmt GhcRn (LHsExpr GhcRn)]
-> RnM ([LStmt GhcRn (LHsExpr GhcRn)], FreeVars)
mkApplicativeStmt ctxt :: HsStmtContext Name
ctxt args :: [ApplicativeArg GhcRn]
args need_join :: Bool
need_join body_stmts :: [LStmt GhcRn (LHsExpr GhcRn)]
body_stmts
  = do { (fmap_op :: SyntaxExpr GhcRn
fmap_op, fvs1 :: FreeVars
fvs1) <- HsStmtContext Name -> Name -> RnM (SyntaxExpr GhcRn, FreeVars)
lookupStmtName HsStmtContext Name
ctxt Name
fmapName
       ; (ap_op :: SyntaxExpr GhcRn
ap_op, fvs2 :: FreeVars
fvs2) <- HsStmtContext Name -> Name -> RnM (SyntaxExpr GhcRn, FreeVars)
lookupStmtName HsStmtContext Name
ctxt Name
apAName
       ; (mb_join :: Maybe (SyntaxExpr GhcRn)
mb_join, fvs3 :: FreeVars
fvs3) <-
           if Bool
need_join then
             do { (join_op :: SyntaxExpr GhcRn
join_op, fvs :: FreeVars
fvs) <- HsStmtContext Name -> Name -> RnM (SyntaxExpr GhcRn, FreeVars)
lookupStmtName HsStmtContext Name
ctxt Name
joinMName
                ; (Maybe (SyntaxExpr GhcRn), FreeVars)
-> RnM (Maybe (SyntaxExpr GhcRn), FreeVars)
forall (m :: * -> *) a. Monad m => a -> m a
return (SyntaxExpr GhcRn -> Maybe (SyntaxExpr GhcRn)
forall a. a -> Maybe a
Just SyntaxExpr GhcRn
join_op, FreeVars
fvs) }
           else
             (Maybe (SyntaxExpr GhcRn), FreeVars)
-> RnM (Maybe (SyntaxExpr GhcRn), FreeVars)
forall (m :: * -> *) a. Monad m => a -> m a
return (Maybe (SyntaxExpr GhcRn)
forall a. Maybe a
Nothing, FreeVars
emptyNameSet)
       ; let applicative_stmt :: LStmt GhcRn (LHsExpr GhcRn)
applicative_stmt = SrcSpanLess (LStmt GhcRn (LHsExpr GhcRn))
-> LStmt GhcRn (LHsExpr GhcRn)
forall a. HasSrcSpan a => SrcSpanLess a -> a
noLoc (SrcSpanLess (LStmt GhcRn (LHsExpr GhcRn))
 -> LStmt GhcRn (LHsExpr GhcRn))
-> SrcSpanLess (LStmt GhcRn (LHsExpr GhcRn))
-> LStmt GhcRn (LHsExpr GhcRn)
forall a b. (a -> b) -> a -> b
$ XApplicativeStmt GhcRn GhcRn (LHsExpr GhcRn)
-> [(SyntaxExpr GhcRn, ApplicativeArg GhcRn)]
-> Maybe (SyntaxExpr GhcRn)
-> StmtLR GhcRn GhcRn (LHsExpr GhcRn)
forall idL idR body.
XApplicativeStmt idL idR body
-> [(SyntaxExpr idR, ApplicativeArg idL)]
-> Maybe (SyntaxExpr idR)
-> StmtLR idL idR body
ApplicativeStmt XApplicativeStmt GhcRn GhcRn (LHsExpr GhcRn)
NoExt
noExt
               ([SyntaxExpr GhcRn]
-> [ApplicativeArg GhcRn]
-> [(SyntaxExpr GhcRn, ApplicativeArg GhcRn)]
forall a b. [a] -> [b] -> [(a, b)]
zip (SyntaxExpr GhcRn
fmap_op SyntaxExpr GhcRn -> [SyntaxExpr GhcRn] -> [SyntaxExpr GhcRn]
forall a. a -> [a] -> [a]
: SyntaxExpr GhcRn -> [SyntaxExpr GhcRn]
forall a. a -> [a]
repeat SyntaxExpr GhcRn
ap_op) [ApplicativeArg GhcRn]
args)
               Maybe (SyntaxExpr GhcRn)
mb_join
       ; ([LStmt GhcRn (LHsExpr GhcRn)], FreeVars)
-> RnM ([LStmt GhcRn (LHsExpr GhcRn)], FreeVars)
forall (m :: * -> *) a. Monad m => a -> m a
return ( LStmt GhcRn (LHsExpr GhcRn)
applicative_stmt LStmt GhcRn (LHsExpr GhcRn)
-> [LStmt GhcRn (LHsExpr GhcRn)] -> [LStmt GhcRn (LHsExpr GhcRn)]
forall a. a -> [a] -> [a]
: [LStmt GhcRn (LHsExpr GhcRn)]
body_stmts
                , FreeVars
fvs1 FreeVars -> FreeVars -> FreeVars
`plusFV` FreeVars
fvs2 FreeVars -> FreeVars -> FreeVars
`plusFV` FreeVars
fvs3) }

-- | Given the statements following an ApplicativeStmt, determine whether
-- we need a @join@ or not, and remove the @return@ if necessary.
needJoin :: MonadNames
         -> [ExprLStmt GhcRn]
         -> (Bool, [ExprLStmt GhcRn])
needJoin :: MonadNames
-> [LStmt GhcRn (LHsExpr GhcRn)]
-> (Bool, [LStmt GhcRn (LHsExpr GhcRn)])
needJoin _monad_names :: MonadNames
_monad_names [] = (Bool
False, [])  -- we're in an ApplicativeArg
needJoin monad_names :: MonadNames
monad_names  [L loc :: SrcSpan
loc (LastStmt _ e :: LHsExpr GhcRn
e _ t :: SyntaxExpr GhcRn
t)]
 | Just arg :: LHsExpr GhcRn
arg <- MonadNames -> LHsExpr GhcRn -> Maybe (LHsExpr GhcRn)
isReturnApp MonadNames
monad_names LHsExpr GhcRn
e =
       (Bool
False, [SrcSpan
-> StmtLR GhcRn GhcRn (LHsExpr GhcRn)
-> LStmt GhcRn (LHsExpr GhcRn)
forall l e. l -> e -> GenLocated l e
L SrcSpan
loc (XLastStmt GhcRn GhcRn (LHsExpr GhcRn)
-> LHsExpr GhcRn
-> Bool
-> SyntaxExpr GhcRn
-> StmtLR GhcRn GhcRn (LHsExpr GhcRn)
forall idL idR body.
XLastStmt idL idR body
-> body -> Bool -> SyntaxExpr idR -> StmtLR idL idR body
LastStmt XLastStmt GhcRn GhcRn (LHsExpr GhcRn)
NoExt
noExt LHsExpr GhcRn
arg Bool
True SyntaxExpr GhcRn
t)])
needJoin _monad_names :: MonadNames
_monad_names stmts :: [LStmt GhcRn (LHsExpr GhcRn)]
stmts = (Bool
True, [LStmt GhcRn (LHsExpr GhcRn)]
stmts)

-- | @Just e@, if the expression is @return e@ or @return $ e@,
-- otherwise @Nothing@
isReturnApp :: MonadNames
            -> LHsExpr GhcRn
            -> Maybe (LHsExpr GhcRn)
isReturnApp :: MonadNames -> LHsExpr GhcRn -> Maybe (LHsExpr GhcRn)
isReturnApp monad_names :: MonadNames
monad_names (L _ (HsPar _ expr :: LHsExpr GhcRn
expr)) = MonadNames -> LHsExpr GhcRn -> Maybe (LHsExpr GhcRn)
isReturnApp MonadNames
monad_names LHsExpr GhcRn
expr
isReturnApp monad_names :: MonadNames
monad_names (L _ e :: HsExpr GhcRn
e) = case HsExpr GhcRn
e of
  OpApp _ l :: LHsExpr GhcRn
l op :: LHsExpr GhcRn
op r :: LHsExpr GhcRn
r | LHsExpr GhcRn -> Bool
is_return LHsExpr GhcRn
l, LHsExpr GhcRn -> Bool
is_dollar LHsExpr GhcRn
op -> LHsExpr GhcRn -> Maybe (LHsExpr GhcRn)
forall a. a -> Maybe a
Just LHsExpr GhcRn
r
  HsApp _ f :: LHsExpr GhcRn
f arg :: LHsExpr GhcRn
arg  | LHsExpr GhcRn -> Bool
is_return LHsExpr GhcRn
f               -> LHsExpr GhcRn -> Maybe (LHsExpr GhcRn)
forall a. a -> Maybe a
Just LHsExpr GhcRn
arg
  _otherwise :: HsExpr GhcRn
_otherwise -> Maybe (LHsExpr GhcRn)
forall a. Maybe a
Nothing
 where
  is_var :: (IdP p -> Bool) -> LHsExpr p -> Bool
is_var f :: IdP p -> Bool
f (L _ (HsPar _ e :: LHsExpr p
e)) = (IdP p -> Bool) -> LHsExpr p -> Bool
is_var IdP p -> Bool
f LHsExpr p
e
  is_var f :: IdP p -> Bool
f (L _ (HsAppType _ e :: LHsExpr p
e _)) = (IdP p -> Bool) -> LHsExpr p -> Bool
is_var IdP p -> Bool
f LHsExpr p
e
  is_var f :: IdP p -> Bool
f (L _ (HsVar _ (L _ r :: IdP p
r))) = IdP p -> Bool
f IdP p
r
       -- TODO: I don't know how to get this right for rebindable syntax
  is_var _ _ = Bool
False

  is_return :: LHsExpr GhcRn -> Bool
is_return = (IdP GhcRn -> Bool) -> LHsExpr GhcRn -> Bool
forall p. (IdP p -> Bool) -> LHsExpr p -> Bool
is_var (\n :: IdP GhcRn
n -> Name
IdP GhcRn
n Name -> Name -> Bool
forall a. Eq a => a -> a -> Bool
== MonadNames -> Name
return_name MonadNames
monad_names
                         Bool -> Bool -> Bool
|| Name
IdP GhcRn
n Name -> Name -> Bool
forall a. Eq a => a -> a -> Bool
== MonadNames -> Name
pure_name MonadNames
monad_names)
  is_dollar :: LHsExpr GhcRn -> Bool
is_dollar = (IdP GhcRn -> Bool) -> LHsExpr GhcRn -> Bool
forall p. (IdP p -> Bool) -> LHsExpr p -> Bool
is_var (IdP GhcRn -> Unique -> Bool
forall a. Uniquable a => a -> Unique -> Bool
`hasKey` Unique
dollarIdKey)

{-
************************************************************************
*                                                                      *
\subsubsection{Errors}
*                                                                      *
************************************************************************
-}

checkEmptyStmts :: HsStmtContext Name -> RnM ()
-- We've seen an empty sequence of Stmts... is that ok?
checkEmptyStmts :: HsStmtContext Name -> IOEnv (Env TcGblEnv TcLclEnv) ()
checkEmptyStmts ctxt :: HsStmtContext Name
ctxt
  = Bool
-> IOEnv (Env TcGblEnv TcLclEnv) ()
-> IOEnv (Env TcGblEnv TcLclEnv) ()
forall (f :: * -> *). Applicative f => Bool -> f () -> f ()
unless (HsStmtContext Name -> Bool
forall id. HsStmtContext id -> Bool
okEmpty HsStmtContext Name
ctxt) (MsgDoc -> IOEnv (Env TcGblEnv TcLclEnv) ()
addErr (HsStmtContext Name -> MsgDoc
emptyErr HsStmtContext Name
ctxt))

okEmpty :: HsStmtContext a -> Bool
okEmpty :: HsStmtContext a -> Bool
okEmpty (PatGuard {}) = Bool
True
okEmpty _             = Bool
False

emptyErr :: HsStmtContext Name -> SDoc
emptyErr :: HsStmtContext Name -> MsgDoc
emptyErr (ParStmtCtxt {})   = String -> MsgDoc
text "Empty statement group in parallel comprehension"
emptyErr (TransStmtCtxt {}) = String -> MsgDoc
text "Empty statement group preceding 'group' or 'then'"
emptyErr ctxt :: HsStmtContext Name
ctxt               = String -> MsgDoc
text "Empty" MsgDoc -> MsgDoc -> MsgDoc
<+> HsStmtContext Name -> MsgDoc
forall id.
(Outputable id, Outputable (NameOrRdrName id)) =>
HsStmtContext id -> MsgDoc
pprStmtContext HsStmtContext Name
ctxt

----------------------
checkLastStmt :: Outputable (body GhcPs) => HsStmtContext Name
              -> LStmt GhcPs (Located (body GhcPs))
              -> RnM (LStmt GhcPs (Located (body GhcPs)))
checkLastStmt :: HsStmtContext Name
-> LStmt GhcPs (Located (body GhcPs))
-> RnM (LStmt GhcPs (Located (body GhcPs)))
checkLastStmt ctxt :: HsStmtContext Name
ctxt lstmt :: LStmt GhcPs (Located (body GhcPs))
lstmt@(L loc :: SrcSpan
loc stmt :: StmtLR GhcPs GhcPs (Located (body GhcPs))
stmt)
  = case HsStmtContext Name
ctxt of
      ListComp  -> RnM (LStmt GhcPs (Located (body GhcPs)))
check_comp
      MonadComp -> RnM (LStmt GhcPs (Located (body GhcPs)))
check_comp
      ArrowExpr -> RnM (LStmt GhcPs (Located (body GhcPs)))
check_do
      DoExpr    -> RnM (LStmt GhcPs (Located (body GhcPs)))
check_do
      MDoExpr   -> RnM (LStmt GhcPs (Located (body GhcPs)))
check_do
      _         -> RnM (LStmt GhcPs (Located (body GhcPs)))
check_other
  where
    check_do :: RnM (LStmt GhcPs (Located (body GhcPs)))
check_do    -- Expect BodyStmt, and change it to LastStmt
      = case StmtLR GhcPs GhcPs (Located (body GhcPs))
stmt of
          BodyStmt _ e :: Located (body GhcPs)
e _ _ -> LStmt GhcPs (Located (body GhcPs))
-> RnM (LStmt GhcPs (Located (body GhcPs)))
forall (m :: * -> *) a. Monad m => a -> m a
return (SrcSpan
-> StmtLR GhcPs GhcPs (Located (body GhcPs))
-> LStmt GhcPs (Located (body GhcPs))
forall l e. l -> e -> GenLocated l e
L SrcSpan
loc (Located (body GhcPs) -> StmtLR GhcPs GhcPs (Located (body GhcPs))
forall (bodyR :: * -> *) (idR :: Pass) (idL :: Pass).
Located (bodyR (GhcPass idR))
-> StmtLR
     (GhcPass idL) (GhcPass idR) (Located (bodyR (GhcPass idR)))
mkLastStmt Located (body GhcPs)
e))
          LastStmt {}      -> LStmt GhcPs (Located (body GhcPs))
-> RnM (LStmt GhcPs (Located (body GhcPs)))
forall (m :: * -> *) a. Monad m => a -> m a
return LStmt GhcPs (Located (body GhcPs))
lstmt   -- "Deriving" clauses may generate a
                                             -- LastStmt directly (unlike the parser)
          _                -> do { MsgDoc -> IOEnv (Env TcGblEnv TcLclEnv) ()
addErr (MsgDoc -> Int -> MsgDoc -> MsgDoc
hang MsgDoc
last_error 2 (StmtLR GhcPs GhcPs (Located (body GhcPs)) -> MsgDoc
forall a. Outputable a => a -> MsgDoc
ppr StmtLR GhcPs GhcPs (Located (body GhcPs))
stmt)); LStmt GhcPs (Located (body GhcPs))
-> RnM (LStmt GhcPs (Located (body GhcPs)))
forall (m :: * -> *) a. Monad m => a -> m a
return LStmt GhcPs (Located (body GhcPs))
lstmt }
    last_error :: MsgDoc
last_error = (String -> MsgDoc
text "The last statement in" MsgDoc -> MsgDoc -> MsgDoc
<+> HsStmtContext Name -> MsgDoc
forall id.
(Outputable id, Outputable (NameOrRdrName id)) =>
HsStmtContext id -> MsgDoc
pprAStmtContext HsStmtContext Name
ctxt
                  MsgDoc -> MsgDoc -> MsgDoc
<+> String -> MsgDoc
text "must be an expression")

    check_comp :: RnM (LStmt GhcPs (Located (body GhcPs)))
check_comp  -- Expect LastStmt; this should be enforced by the parser!
      = case StmtLR GhcPs GhcPs (Located (body GhcPs))
stmt of
          LastStmt {} -> LStmt GhcPs (Located (body GhcPs))
-> RnM (LStmt GhcPs (Located (body GhcPs)))
forall (m :: * -> *) a. Monad m => a -> m a
return LStmt GhcPs (Located (body GhcPs))
lstmt
          _           -> String -> MsgDoc -> RnM (LStmt GhcPs (Located (body GhcPs)))
forall a. HasCallStack => String -> MsgDoc -> a
pprPanic "checkLastStmt" (LStmt GhcPs (Located (body GhcPs)) -> MsgDoc
forall a. Outputable a => a -> MsgDoc
ppr LStmt GhcPs (Located (body GhcPs))
lstmt)

    check_other :: RnM (LStmt GhcPs (Located (body GhcPs)))
check_other -- Behave just as if this wasn't the last stmt
      = do { HsStmtContext Name
-> LStmt GhcPs (Located (body GhcPs))
-> IOEnv (Env TcGblEnv TcLclEnv) ()
forall (body :: * -> *).
HsStmtContext Name
-> LStmt GhcPs (Located (body GhcPs))
-> IOEnv (Env TcGblEnv TcLclEnv) ()
checkStmt HsStmtContext Name
ctxt LStmt GhcPs (Located (body GhcPs))
lstmt; LStmt GhcPs (Located (body GhcPs))
-> RnM (LStmt GhcPs (Located (body GhcPs)))
forall (m :: * -> *) a. Monad m => a -> m a
return LStmt GhcPs (Located (body GhcPs))
lstmt }

-- Checking when a particular Stmt is ok
checkStmt :: HsStmtContext Name
          -> LStmt GhcPs (Located (body GhcPs))
          -> RnM ()
checkStmt :: HsStmtContext Name
-> LStmt GhcPs (Located (body GhcPs))
-> IOEnv (Env TcGblEnv TcLclEnv) ()
checkStmt ctxt :: HsStmtContext Name
ctxt (L _ stmt :: StmtLR GhcPs GhcPs (Located (body GhcPs))
stmt)
  = do { DynFlags
dflags <- IOEnv (Env TcGblEnv TcLclEnv) DynFlags
forall (m :: * -> *). HasDynFlags m => m DynFlags
getDynFlags
       ; case DynFlags
-> HsStmtContext Name
-> StmtLR GhcPs GhcPs (Located (body GhcPs))
-> Validity
forall (body :: * -> *).
DynFlags
-> HsStmtContext Name
-> Stmt GhcPs (Located (body GhcPs))
-> Validity
okStmt DynFlags
dflags HsStmtContext Name
ctxt StmtLR GhcPs GhcPs (Located (body GhcPs))
stmt of
           IsValid        -> () -> IOEnv (Env TcGblEnv TcLclEnv) ()
forall (m :: * -> *) a. Monad m => a -> m a
return ()
           NotValid extra :: MsgDoc
extra -> MsgDoc -> IOEnv (Env TcGblEnv TcLclEnv) ()
addErr (MsgDoc
msg MsgDoc -> MsgDoc -> MsgDoc
$$ MsgDoc
extra) }
  where
   msg :: MsgDoc
msg = [MsgDoc] -> MsgDoc
sep [ String -> MsgDoc
text "Unexpected" MsgDoc -> MsgDoc -> MsgDoc
<+> StmtLR GhcPs GhcPs (Located (body GhcPs)) -> MsgDoc
forall a body. Stmt a body -> MsgDoc
pprStmtCat StmtLR GhcPs GhcPs (Located (body GhcPs))
stmt MsgDoc -> MsgDoc -> MsgDoc
<+> PtrString -> MsgDoc
ptext (String -> PtrString
sLit "statement")
             , String -> MsgDoc
text "in" MsgDoc -> MsgDoc -> MsgDoc
<+> HsStmtContext Name -> MsgDoc
forall id.
(Outputable id, Outputable (NameOrRdrName id)) =>
HsStmtContext id -> MsgDoc
pprAStmtContext HsStmtContext Name
ctxt ]

pprStmtCat :: Stmt a body -> SDoc
pprStmtCat :: Stmt a body -> MsgDoc
pprStmtCat (TransStmt {})     = String -> MsgDoc
text "transform"
pprStmtCat (LastStmt {})      = String -> MsgDoc
text "return expression"
pprStmtCat (BodyStmt {})      = String -> MsgDoc
text "body"
pprStmtCat (BindStmt {})      = String -> MsgDoc
text "binding"
pprStmtCat (LetStmt {})       = String -> MsgDoc
text "let"
pprStmtCat (RecStmt {})       = String -> MsgDoc
text "rec"
pprStmtCat (ParStmt {})       = String -> MsgDoc
text "parallel"
pprStmtCat (ApplicativeStmt {}) = String -> MsgDoc
forall a. String -> a
panic "pprStmtCat: ApplicativeStmt"
pprStmtCat (XStmtLR {})         = String -> MsgDoc
forall a. String -> a
panic "pprStmtCat: XStmtLR"

------------
emptyInvalid :: Validity  -- Payload is the empty document
emptyInvalid :: Validity
emptyInvalid = MsgDoc -> Validity
NotValid MsgDoc
Outputable.empty

okStmt, okDoStmt, okCompStmt, okParStmt
   :: DynFlags -> HsStmtContext Name
   -> Stmt GhcPs (Located (body GhcPs)) -> Validity
-- Return Nothing if OK, (Just extra) if not ok
-- The "extra" is an SDoc that is appended to a generic error message

okStmt :: DynFlags
-> HsStmtContext Name
-> Stmt GhcPs (Located (body GhcPs))
-> Validity
okStmt dflags :: DynFlags
dflags ctxt :: HsStmtContext Name
ctxt stmt :: Stmt GhcPs (Located (body GhcPs))
stmt
  = case HsStmtContext Name
ctxt of
      PatGuard {}        -> Stmt GhcPs (Located (body GhcPs)) -> Validity
forall (body :: * -> *).
Stmt GhcPs (Located (body GhcPs)) -> Validity
okPatGuardStmt Stmt GhcPs (Located (body GhcPs))
stmt
      ParStmtCtxt ctxt :: HsStmtContext Name
ctxt   -> DynFlags
-> HsStmtContext Name
-> Stmt GhcPs (Located (body GhcPs))
-> Validity
forall (body :: * -> *).
DynFlags
-> HsStmtContext Name
-> Stmt GhcPs (Located (body GhcPs))
-> Validity
okParStmt  DynFlags
dflags HsStmtContext Name
ctxt Stmt GhcPs (Located (body GhcPs))
stmt
      DoExpr             -> DynFlags
-> HsStmtContext Name
-> Stmt GhcPs (Located (body GhcPs))
-> Validity
forall (body :: * -> *).
DynFlags
-> HsStmtContext Name
-> Stmt GhcPs (Located (body GhcPs))
-> Validity
okDoStmt   DynFlags
dflags HsStmtContext Name
ctxt Stmt GhcPs (Located (body GhcPs))
stmt
      MDoExpr            -> DynFlags
-> HsStmtContext Name
-> Stmt GhcPs (Located (body GhcPs))
-> Validity
forall (body :: * -> *).
DynFlags
-> HsStmtContext Name
-> Stmt GhcPs (Located (body GhcPs))
-> Validity
okDoStmt   DynFlags
dflags HsStmtContext Name
ctxt Stmt GhcPs (Located (body GhcPs))
stmt
      ArrowExpr          -> DynFlags
-> HsStmtContext Name
-> Stmt GhcPs (Located (body GhcPs))
-> Validity
forall (body :: * -> *).
DynFlags
-> HsStmtContext Name
-> Stmt GhcPs (Located (body GhcPs))
-> Validity
okDoStmt   DynFlags
dflags HsStmtContext Name
ctxt Stmt GhcPs (Located (body GhcPs))
stmt
      GhciStmtCtxt       -> DynFlags
-> HsStmtContext Name
-> Stmt GhcPs (Located (body GhcPs))
-> Validity
forall (body :: * -> *).
DynFlags
-> HsStmtContext Name
-> Stmt GhcPs (Located (body GhcPs))
-> Validity
okDoStmt   DynFlags
dflags HsStmtContext Name
ctxt Stmt GhcPs (Located (body GhcPs))
stmt
      ListComp           -> DynFlags
-> HsStmtContext Name
-> Stmt GhcPs (Located (body GhcPs))
-> Validity
forall (body :: * -> *).
DynFlags
-> HsStmtContext Name
-> Stmt GhcPs (Located (body GhcPs))
-> Validity
okCompStmt DynFlags
dflags HsStmtContext Name
ctxt Stmt GhcPs (Located (body GhcPs))
stmt
      MonadComp          -> DynFlags
-> HsStmtContext Name
-> Stmt GhcPs (Located (body GhcPs))
-> Validity
forall (body :: * -> *).
DynFlags
-> HsStmtContext Name
-> Stmt GhcPs (Located (body GhcPs))
-> Validity
okCompStmt DynFlags
dflags HsStmtContext Name
ctxt Stmt GhcPs (Located (body GhcPs))
stmt
      TransStmtCtxt ctxt :: HsStmtContext Name
ctxt -> DynFlags
-> HsStmtContext Name
-> Stmt GhcPs (Located (body GhcPs))
-> Validity
forall (body :: * -> *).
DynFlags
-> HsStmtContext Name
-> Stmt GhcPs (Located (body GhcPs))
-> Validity
okStmt DynFlags
dflags HsStmtContext Name
ctxt Stmt GhcPs (Located (body GhcPs))
stmt

-------------
okPatGuardStmt :: Stmt GhcPs (Located (body GhcPs)) -> Validity
okPatGuardStmt :: Stmt GhcPs (Located (body GhcPs)) -> Validity
okPatGuardStmt stmt :: Stmt GhcPs (Located (body GhcPs))
stmt
  = case Stmt GhcPs (Located (body GhcPs))
stmt of
      BodyStmt {} -> Validity
IsValid
      BindStmt {} -> Validity
IsValid
      LetStmt {}  -> Validity
IsValid
      _           -> Validity
emptyInvalid

-------------
okParStmt :: DynFlags
-> HsStmtContext Name
-> Stmt GhcPs (Located (body GhcPs))
-> Validity
okParStmt dflags :: DynFlags
dflags ctxt :: HsStmtContext Name
ctxt stmt :: Stmt GhcPs (Located (body GhcPs))
stmt
  = case Stmt GhcPs (Located (body GhcPs))
stmt of
      LetStmt _ (L _ (HsIPBinds {})) -> Validity
emptyInvalid
      _                              -> DynFlags
-> HsStmtContext Name
-> Stmt GhcPs (Located (body GhcPs))
-> Validity
forall (body :: * -> *).
DynFlags
-> HsStmtContext Name
-> Stmt GhcPs (Located (body GhcPs))
-> Validity
okStmt DynFlags
dflags HsStmtContext Name
ctxt Stmt GhcPs (Located (body GhcPs))
stmt

----------------
okDoStmt :: DynFlags
-> HsStmtContext Name
-> Stmt GhcPs (Located (body GhcPs))
-> Validity
okDoStmt dflags :: DynFlags
dflags ctxt :: HsStmtContext Name
ctxt stmt :: Stmt GhcPs (Located (body GhcPs))
stmt
  = case Stmt GhcPs (Located (body GhcPs))
stmt of
       RecStmt {}
         | Extension
LangExt.RecursiveDo Extension -> DynFlags -> Bool
`xopt` DynFlags
dflags -> Validity
IsValid
         | HsStmtContext Name
ArrowExpr <- HsStmtContext Name
ctxt -> Validity
IsValid    -- Arrows allows 'rec'
         | Bool
otherwise         -> MsgDoc -> Validity
NotValid (String -> MsgDoc
text "Use RecursiveDo")
       BindStmt {} -> Validity
IsValid
       LetStmt {}  -> Validity
IsValid
       BodyStmt {} -> Validity
IsValid
       _           -> Validity
emptyInvalid

----------------
okCompStmt :: DynFlags
-> HsStmtContext Name
-> Stmt GhcPs (Located (body GhcPs))
-> Validity
okCompStmt dflags :: DynFlags
dflags _ stmt :: Stmt GhcPs (Located (body GhcPs))
stmt
  = case Stmt GhcPs (Located (body GhcPs))
stmt of
       BindStmt {} -> Validity
IsValid
       LetStmt {}  -> Validity
IsValid
       BodyStmt {} -> Validity
IsValid
       ParStmt {}
         | Extension
LangExt.ParallelListComp Extension -> DynFlags -> Bool
`xopt` DynFlags
dflags -> Validity
IsValid
         | Bool
otherwise -> MsgDoc -> Validity
NotValid (String -> MsgDoc
text "Use ParallelListComp")
       TransStmt {}
         | Extension
LangExt.TransformListComp Extension -> DynFlags -> Bool
`xopt` DynFlags
dflags -> Validity
IsValid
         | Bool
otherwise -> MsgDoc -> Validity
NotValid (String -> MsgDoc
text "Use TransformListComp")
       RecStmt {}  -> Validity
emptyInvalid
       LastStmt {} -> Validity
emptyInvalid  -- Should not happen (dealt with by checkLastStmt)
       ApplicativeStmt {} -> Validity
emptyInvalid
       XStmtLR{} -> String -> Validity
forall a. String -> a
panic "okCompStmt"

---------
checkTupleSection :: [LHsTupArg GhcPs] -> RnM ()
checkTupleSection :: [LHsTupArg GhcPs] -> IOEnv (Env TcGblEnv TcLclEnv) ()
checkTupleSection args :: [LHsTupArg GhcPs]
args
  = do  { Bool
tuple_section <- Extension -> TcRnIf TcGblEnv TcLclEnv Bool
forall gbl lcl. Extension -> TcRnIf gbl lcl Bool
xoptM Extension
LangExt.TupleSections
        ; Bool -> MsgDoc -> IOEnv (Env TcGblEnv TcLclEnv) ()
checkErr ((LHsTupArg GhcPs -> Bool) -> [LHsTupArg GhcPs] -> Bool
forall (t :: * -> *) a. Foldable t => (a -> Bool) -> t a -> Bool
all LHsTupArg GhcPs -> Bool
forall id. LHsTupArg id -> Bool
tupArgPresent [LHsTupArg GhcPs]
args Bool -> Bool -> Bool
|| Bool
tuple_section) MsgDoc
msg }
  where
    msg :: MsgDoc
msg = String -> MsgDoc
text "Illegal tuple section: use TupleSections"

---------
sectionErr :: HsExpr GhcPs -> SDoc
sectionErr :: HsExpr GhcPs -> MsgDoc
sectionErr expr :: HsExpr GhcPs
expr
  = MsgDoc -> Int -> MsgDoc -> MsgDoc
hang (String -> MsgDoc
text "A section must be enclosed in parentheses")
       2 (String -> MsgDoc
text "thus:" MsgDoc -> MsgDoc -> MsgDoc
<+> (MsgDoc -> MsgDoc
parens (HsExpr GhcPs -> MsgDoc
forall a. Outputable a => a -> MsgDoc
ppr HsExpr GhcPs
expr)))

patSynErr :: HsExpr GhcPs -> SDoc -> RnM (HsExpr GhcRn, FreeVars)
patSynErr :: HsExpr GhcPs -> MsgDoc -> RnM (HsExpr GhcRn, FreeVars)
patSynErr e :: HsExpr GhcPs
e explanation :: MsgDoc
explanation = do { MsgDoc -> IOEnv (Env TcGblEnv TcLclEnv) ()
addErr ([MsgDoc] -> MsgDoc
sep [String -> MsgDoc
text "Pattern syntax in expression context:",
                                Int -> MsgDoc -> MsgDoc
nest 4 (HsExpr GhcPs -> MsgDoc
forall a. Outputable a => a -> MsgDoc
ppr HsExpr GhcPs
e)] MsgDoc -> MsgDoc -> MsgDoc
$$
                                  MsgDoc
explanation)
                 ; (HsExpr GhcRn, FreeVars) -> RnM (HsExpr GhcRn, FreeVars)
forall (m :: * -> *) a. Monad m => a -> m a
return (XEWildPat GhcRn -> HsExpr GhcRn
forall p. XEWildPat p -> HsExpr p
EWildPat XEWildPat GhcRn
NoExt
noExt, FreeVars
emptyFVs) }

badIpBinds :: Outputable a => SDoc -> a -> SDoc
badIpBinds :: MsgDoc -> a -> MsgDoc
badIpBinds what :: MsgDoc
what binds :: a
binds
  = MsgDoc -> Int -> MsgDoc -> MsgDoc
hang (String -> MsgDoc
text "Implicit-parameter bindings illegal in" MsgDoc -> MsgDoc -> MsgDoc
<+> MsgDoc
what)
         2 (a -> MsgDoc
forall a. Outputable a => a -> MsgDoc
ppr a
binds)

---------

monadFailOp :: LPat GhcPs
            -> HsStmtContext Name
            -> RnM (SyntaxExpr GhcRn, FreeVars)
monadFailOp :: LPat GhcPs
-> HsStmtContext Name -> RnM (SyntaxExpr GhcRn, FreeVars)
monadFailOp pat :: LPat GhcPs
pat ctxt :: HsStmtContext Name
ctxt
  -- If the pattern is irrefutable (e.g.: wildcard, tuple, ~pat, etc.)
  -- we should not need to fail.
  | LPat GhcPs -> Bool
forall (p :: Pass).
OutputableBndrId (GhcPass p) =>
LPat (GhcPass p) -> Bool
isIrrefutableHsPat LPat GhcPs
pat = (SyntaxExpr GhcRn, FreeVars) -> RnM (SyntaxExpr GhcRn, FreeVars)
forall (m :: * -> *) a. Monad m => a -> m a
return (SyntaxExpr GhcRn
forall (p :: Pass). SyntaxExpr (GhcPass p)
noSyntaxExpr, FreeVars
emptyFVs)

  -- For non-monadic contexts (e.g. guard patterns, list
  -- comprehensions, etc.) we should not need to fail.  See Note
  -- [Failing pattern matches in Stmts]
  | Bool -> Bool
not (HsStmtContext Name -> Bool
forall id. HsStmtContext id -> Bool
isMonadFailStmtContext HsStmtContext Name
ctxt) = (SyntaxExpr GhcRn, FreeVars) -> RnM (SyntaxExpr GhcRn, FreeVars)
forall (m :: * -> *) a. Monad m => a -> m a
return (SyntaxExpr GhcRn
forall (p :: Pass). SyntaxExpr (GhcPass p)
noSyntaxExpr, FreeVars
emptyFVs)

  | Bool
otherwise = RnM (SyntaxExpr GhcRn, FreeVars)
getMonadFailOp

{-
Note [Monad fail : Rebindable syntax, overloaded strings]
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Given the code
  foo x = do { Just y <- x; return y }

we expect it to desugar as
  foo x = x >>= \r -> case r of
                        Just y  -> return y
                        Nothing -> fail "Pattern match error"

But with RebindableSyntax and OverloadedStrings, we really want
it to desugar thus:
  foo x = x >>= \r -> case r of
                        Just y  -> return y
                        Nothing -> fail (fromString "Patterm match error")

So, in this case, we synthesize the function
  \x -> fail (fromString x)

(rather than plain 'fail') for the 'fail' operation. This is done in
'getMonadFailOp'.
-}
getMonadFailOp :: RnM (SyntaxExpr GhcRn, FreeVars) -- Syntax expr fail op
getMonadFailOp :: RnM (SyntaxExpr GhcRn, FreeVars)
getMonadFailOp
 = do { Bool
xOverloadedStrings <- (DynFlags -> Bool)
-> IOEnv (Env TcGblEnv TcLclEnv) DynFlags
-> TcRnIf TcGblEnv TcLclEnv Bool
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (Extension -> DynFlags -> Bool
xopt Extension
LangExt.OverloadedStrings) IOEnv (Env TcGblEnv TcLclEnv) DynFlags
forall (m :: * -> *). HasDynFlags m => m DynFlags
getDynFlags
      ; Bool
xRebindableSyntax <- (DynFlags -> Bool)
-> IOEnv (Env TcGblEnv TcLclEnv) DynFlags
-> TcRnIf TcGblEnv TcLclEnv Bool
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (Extension -> DynFlags -> Bool
xopt Extension
LangExt.RebindableSyntax) IOEnv (Env TcGblEnv TcLclEnv) DynFlags
forall (m :: * -> *). HasDynFlags m => m DynFlags
getDynFlags
      ; Bool -> Bool -> RnM (SyntaxExpr GhcRn, FreeVars)
reallyGetMonadFailOp Bool
xRebindableSyntax Bool
xOverloadedStrings
      }
  where
    reallyGetMonadFailOp :: Bool -> Bool -> RnM (SyntaxExpr GhcRn, FreeVars)
reallyGetMonadFailOp rebindableSyntax :: Bool
rebindableSyntax overloadedStrings :: Bool
overloadedStrings
      | Bool
rebindableSyntax Bool -> Bool -> Bool
&& Bool
overloadedStrings = do
        (failExpr :: SyntaxExpr GhcRn
failExpr, failFvs :: FreeVars
failFvs) <- Name -> RnM (SyntaxExpr GhcRn, FreeVars)
lookupSyntaxName Name
failMName
        (fromStringExpr :: SyntaxExpr GhcRn
fromStringExpr, fromStringFvs :: FreeVars
fromStringFvs) <- Name -> RnM (SyntaxExpr GhcRn, FreeVars)
lookupSyntaxName Name
fromStringName
        let arg_lit :: FastString
arg_lit = String -> FastString
fsLit "arg"
            arg_name :: Name
arg_name = Unique -> FastString -> Name
mkSystemVarName (FastString -> Unique
mkVarOccUnique FastString
arg_lit) FastString
arg_lit
            arg_syn_expr :: SyntaxExpr GhcRn
arg_syn_expr = Name -> SyntaxExpr GhcRn
mkRnSyntaxExpr Name
arg_name
        let LHsExpr GhcRn
body :: LHsExpr GhcRn =
              LHsExpr GhcRn -> LHsExpr GhcRn -> LHsExpr GhcRn
forall (id :: Pass).
LHsExpr (GhcPass id)
-> LHsExpr (GhcPass id) -> LHsExpr (GhcPass id)
nlHsApp (SrcSpanLess (LHsExpr GhcRn) -> LHsExpr GhcRn
forall a. HasSrcSpan a => SrcSpanLess a -> a
noLoc (SrcSpanLess (LHsExpr GhcRn) -> LHsExpr GhcRn)
-> SrcSpanLess (LHsExpr GhcRn) -> LHsExpr GhcRn
forall a b. (a -> b) -> a -> b
$ SyntaxExpr GhcRn -> HsExpr GhcRn
forall p. SyntaxExpr p -> HsExpr p
syn_expr SyntaxExpr GhcRn
failExpr)
                      (LHsExpr GhcRn -> LHsExpr GhcRn -> LHsExpr GhcRn
forall (id :: Pass).
LHsExpr (GhcPass id)
-> LHsExpr (GhcPass id) -> LHsExpr (GhcPass id)
nlHsApp (SrcSpanLess (LHsExpr GhcRn) -> LHsExpr GhcRn
forall a. HasSrcSpan a => SrcSpanLess a -> a
noLoc (SrcSpanLess (LHsExpr GhcRn) -> LHsExpr GhcRn)
-> SrcSpanLess (LHsExpr GhcRn) -> LHsExpr GhcRn
forall a b. (a -> b) -> a -> b
$ SyntaxExpr GhcRn -> HsExpr GhcRn
forall p. SyntaxExpr p -> HsExpr p
syn_expr SyntaxExpr GhcRn
fromStringExpr)
                                (SrcSpanLess (LHsExpr GhcRn) -> LHsExpr GhcRn
forall a. HasSrcSpan a => SrcSpanLess a -> a
noLoc (SrcSpanLess (LHsExpr GhcRn) -> LHsExpr GhcRn)
-> SrcSpanLess (LHsExpr GhcRn) -> LHsExpr GhcRn
forall a b. (a -> b) -> a -> b
$ SyntaxExpr GhcRn -> HsExpr GhcRn
forall p. SyntaxExpr p -> HsExpr p
syn_expr SyntaxExpr GhcRn
arg_syn_expr))
        let HsExpr GhcRn
failAfterFromStringExpr :: HsExpr GhcRn =
              LHsExpr GhcRn -> HsExpr GhcRn
forall a. HasSrcSpan a => a -> SrcSpanLess a
unLoc (LHsExpr GhcRn -> HsExpr GhcRn) -> LHsExpr GhcRn -> HsExpr GhcRn
forall a b. (a -> b) -> a -> b
$ [LPat GhcRn] -> LHsExpr GhcRn -> LHsExpr GhcRn
forall (p :: Pass).
(XMG (GhcPass p) (LHsExpr (GhcPass p)) ~ NoExt) =>
[LPat (GhcPass p)] -> LHsExpr (GhcPass p) -> LHsExpr (GhcPass p)
mkHsLam [SrcSpanLess (LPat GhcRn) -> LPat GhcRn
forall a. HasSrcSpan a => SrcSpanLess a -> a
noLoc (SrcSpanLess (LPat GhcRn) -> LPat GhcRn)
-> SrcSpanLess (LPat GhcRn) -> LPat GhcRn
forall a b. (a -> b) -> a -> b
$ XVarPat GhcRn -> Located (IdP GhcRn) -> LPat GhcRn
forall p. XVarPat p -> Located (IdP p) -> Pat p
VarPat XVarPat GhcRn
NoExt
noExt (Located (IdP GhcRn) -> SrcSpanLess (LPat GhcRn))
-> Located (IdP GhcRn) -> SrcSpanLess (LPat GhcRn)
forall a b. (a -> b) -> a -> b
$ SrcSpanLess (Located Name) -> Located Name
forall a. HasSrcSpan a => SrcSpanLess a -> a
noLoc Name
SrcSpanLess (Located Name)
arg_name] LHsExpr GhcRn
body
        let SyntaxExpr GhcRn
failAfterFromStringSynExpr :: SyntaxExpr GhcRn =
              HsExpr GhcRn -> SyntaxExpr GhcRn
forall (p :: Pass). HsExpr (GhcPass p) -> SyntaxExpr (GhcPass p)
mkSyntaxExpr HsExpr GhcRn
failAfterFromStringExpr
        (SyntaxExpr GhcRn, FreeVars) -> RnM (SyntaxExpr GhcRn, FreeVars)
forall (m :: * -> *) a. Monad m => a -> m a
return (SyntaxExpr GhcRn
failAfterFromStringSynExpr, FreeVars
failFvs FreeVars -> FreeVars -> FreeVars
`plusFV` FreeVars
fromStringFvs)
      | Bool
otherwise = Name -> RnM (SyntaxExpr GhcRn, FreeVars)
lookupSyntaxName Name
failMName