{-# LANGUAGE CPP #-}
{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE TypeFamilies #-}
{-# LANGUAGE RankNTypes #-}
{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE ViewPatterns #-}
{-# LANGUAGE DeriveFunctor #-}
{-# OPTIONS_GHC -Wno-incomplete-uni-patterns #-}
{-# OPTIONS_GHC -Wno-incomplete-record-updates #-}
module GHC.Rename.Pat (
rnPat, rnPats, rnBindPat, rnPatAndThen,
NameMaker, applyNameMaker,
localRecNameMaker, topRecNameMaker,
isTopRecNameMaker,
rnHsRecFields, HsRecFieldContext(..),
rnHsRecUpdFields,
CpsRn, liftCps,
rnLit, rnOverLit,
checkTupSize, patSigErr
) where
import GHC.Prelude
import {-# SOURCE #-} GHC.Rename.Expr ( rnLExpr )
import {-# SOURCE #-} GHC.Rename.Splice ( rnSplicePat )
#include "HsVersions.h"
import GHC.Hs
import GHC.Tc.Utils.Monad
import GHC.Tc.Utils.Zonk ( hsOverLitName )
import GHC.Rename.Env
import GHC.Rename.Fixity
import GHC.Rename.Utils ( HsDocContext(..), newLocalBndrRn, bindLocalNames
, warnUnusedMatches, newLocalBndrRn
, checkUnusedRecordWildcard
, checkDupNames, checkDupAndShadowedNames
, checkTupSize , unknownSubordinateErr )
import GHC.Rename.HsType
import GHC.Builtin.Names
import GHC.Types.Name
import GHC.Types.Name.Set
import GHC.Types.Name.Reader
import GHC.Types.Basic
import GHC.Utils.Misc
import GHC.Data.List.SetOps( removeDups )
import GHC.Utils.Outputable
import GHC.Types.SrcLoc
import GHC.Types.Literal ( inCharRange )
import GHC.Builtin.Types ( nilDataCon )
import GHC.Core.DataCon
import qualified GHC.LanguageExtensions as LangExt
import Control.Monad ( when, ap, guard )
import qualified Data.List.NonEmpty as NE
import Data.Ratio
newtype CpsRn b = CpsRn { CpsRn b -> forall r. (b -> RnM (r, FreeVars)) -> RnM (r, FreeVars)
unCpsRn :: forall r. (b -> RnM (r, FreeVars))
-> RnM (r, FreeVars) }
deriving (a -> CpsRn b -> CpsRn a
(a -> b) -> CpsRn a -> CpsRn b
(forall a b. (a -> b) -> CpsRn a -> CpsRn b)
-> (forall a b. a -> CpsRn b -> CpsRn a) -> Functor CpsRn
forall a b. a -> CpsRn b -> CpsRn a
forall a b. (a -> b) -> CpsRn a -> CpsRn b
forall (f :: * -> *).
(forall a b. (a -> b) -> f a -> f b)
-> (forall a b. a -> f b -> f a) -> Functor f
<$ :: a -> CpsRn b -> CpsRn a
$c<$ :: forall a b. a -> CpsRn b -> CpsRn a
fmap :: (a -> b) -> CpsRn a -> CpsRn b
$cfmap :: forall a b. (a -> b) -> CpsRn a -> CpsRn b
Functor)
instance Applicative CpsRn where
pure :: a -> CpsRn a
pure a
x = (forall r. (a -> RnM (r, FreeVars)) -> RnM (r, FreeVars))
-> CpsRn a
forall b.
(forall r. (b -> RnM (r, FreeVars)) -> RnM (r, FreeVars))
-> CpsRn b
CpsRn (\a -> RnM (r, FreeVars)
k -> a -> RnM (r, FreeVars)
k a
x)
<*> :: CpsRn (a -> b) -> CpsRn a -> CpsRn b
(<*>) = CpsRn (a -> b) -> CpsRn a -> CpsRn b
forall (m :: * -> *) a b. Monad m => m (a -> b) -> m a -> m b
Instance of class: Monad of the constraint type Monad CpsRn
ap
instance Monad CpsRn where
(CpsRn forall r. (a -> RnM (r, FreeVars)) -> RnM (r, FreeVars)
m) >>= :: CpsRn a -> (a -> CpsRn b) -> CpsRn b
>>= a -> CpsRn b
mk = (forall r. (b -> RnM (r, FreeVars)) -> RnM (r, FreeVars))
-> CpsRn b
forall b.
(forall r. (b -> RnM (r, FreeVars)) -> RnM (r, FreeVars))
-> CpsRn b
CpsRn (\b -> RnM (r, FreeVars)
k -> (a -> RnM (r, FreeVars)) -> RnM (r, FreeVars)
forall r. (a -> RnM (r, FreeVars)) -> RnM (r, FreeVars)
m (\a
v -> CpsRn b -> forall r. (b -> RnM (r, FreeVars)) -> RnM (r, FreeVars)
forall b.
CpsRn b -> forall r. (b -> RnM (r, FreeVars)) -> RnM (r, FreeVars)
unCpsRn (a -> CpsRn b
mk a
v) b -> RnM (r, FreeVars)
k))
runCps :: CpsRn a -> RnM (a, FreeVars)
runCps :: CpsRn a -> RnM (a, FreeVars)
runCps (CpsRn forall r. (a -> RnM (r, FreeVars)) -> RnM (r, FreeVars)
m) = (a -> RnM (a, FreeVars)) -> RnM (a, FreeVars)
forall r. (a -> RnM (r, FreeVars)) -> RnM (r, FreeVars)
m (\a
r -> (a, FreeVars) -> RnM (a, FreeVars)
forall (m :: * -> *) a. Monad m => a -> m a
External instance of the constraint type forall m. Monad (IOEnv m)
return (a
r, FreeVars
emptyFVs))
liftCps :: RnM a -> CpsRn a
liftCps :: RnM a -> CpsRn a
liftCps RnM a
rn_thing = (forall r. (a -> RnM (r, FreeVars)) -> RnM (r, FreeVars))
-> CpsRn a
forall b.
(forall r. (b -> RnM (r, FreeVars)) -> RnM (r, FreeVars))
-> CpsRn b
CpsRn (\a -> RnM (r, FreeVars)
k -> RnM a
rn_thing RnM a -> (a -> RnM (r, FreeVars)) -> RnM (r, FreeVars)
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
External instance of the constraint type forall m. Monad (IOEnv m)
>>= a -> RnM (r, FreeVars)
k)
liftCpsFV :: RnM (a, FreeVars) -> CpsRn a
liftCpsFV :: RnM (a, FreeVars) -> CpsRn a
liftCpsFV RnM (a, FreeVars)
rn_thing = (forall r. (a -> RnM (r, FreeVars)) -> RnM (r, FreeVars))
-> CpsRn a
forall b.
(forall r. (b -> RnM (r, FreeVars)) -> RnM (r, FreeVars))
-> CpsRn b
CpsRn (\a -> RnM (r, FreeVars)
k -> do { (a
v,FreeVars
fvs1) <- RnM (a, FreeVars)
rn_thing
; (r
r,FreeVars
fvs2) <- a -> RnM (r, FreeVars)
k a
v
; (r, FreeVars) -> RnM (r, FreeVars)
forall (m :: * -> *) a. Monad m => a -> m a
External instance of the constraint type forall m. Monad (IOEnv m)
return (r
r, FreeVars
fvs1 FreeVars -> FreeVars -> FreeVars
`plusFV` FreeVars
fvs2) })
wrapSrcSpanCps :: (a -> CpsRn b) -> Located a -> CpsRn (Located b)
wrapSrcSpanCps :: (a -> CpsRn b) -> Located a -> CpsRn (Located b)
wrapSrcSpanCps a -> CpsRn b
fn (L SrcSpan
loc a
a)
= (forall r. (Located b -> RnM (r, FreeVars)) -> RnM (r, FreeVars))
-> CpsRn (Located b)
forall b.
(forall r. (b -> RnM (r, FreeVars)) -> RnM (r, FreeVars))
-> CpsRn b
CpsRn (\Located b -> RnM (r, FreeVars)
k -> SrcSpan -> RnM (r, FreeVars) -> RnM (r, FreeVars)
forall a. SrcSpan -> TcRn a -> TcRn a
setSrcSpan SrcSpan
loc (RnM (r, FreeVars) -> RnM (r, FreeVars))
-> RnM (r, FreeVars) -> RnM (r, FreeVars)
forall a b. (a -> b) -> a -> b
$
CpsRn b -> forall r. (b -> RnM (r, FreeVars)) -> RnM (r, FreeVars)
forall b.
CpsRn b -> forall r. (b -> RnM (r, FreeVars)) -> RnM (r, FreeVars)
unCpsRn (a -> CpsRn b
fn a
a) ((b -> RnM (r, FreeVars)) -> RnM (r, FreeVars))
-> (b -> RnM (r, FreeVars)) -> RnM (r, FreeVars)
forall a b. (a -> b) -> a -> b
$ \b
v ->
Located b -> RnM (r, FreeVars)
k (SrcSpan -> b -> Located b
forall l e. l -> e -> GenLocated l e
L SrcSpan
loc b
v))
lookupConCps :: Located RdrName -> CpsRn (Located Name)
lookupConCps :: Located RdrName -> CpsRn (Located Name)
lookupConCps Located RdrName
con_rdr
= (forall r.
(Located Name -> RnM (r, FreeVars)) -> RnM (r, FreeVars))
-> CpsRn (Located Name)
forall b.
(forall r. (b -> RnM (r, FreeVars)) -> RnM (r, FreeVars))
-> CpsRn b
CpsRn (\Located Name -> RnM (r, FreeVars)
k -> do { Located Name
con_name <- Located RdrName -> RnM (Located Name)
lookupLocatedOccRn Located RdrName
con_rdr
; (r
r, FreeVars
fvs) <- Located Name -> RnM (r, FreeVars)
k Located Name
con_name
; (r, FreeVars) -> RnM (r, FreeVars)
forall (m :: * -> *) a. Monad m => a -> m a
External instance of the constraint type forall m. Monad (IOEnv m)
return (r
r, FreeVars -> Name -> FreeVars
addOneFV FreeVars
fvs (Located Name -> Name
forall l e. GenLocated l e -> e
unLoc Located Name
con_name)) })
data NameMaker
= LamMk
Bool
| LetMk
TopLevelFlag
MiniFixityEnv
topRecNameMaker :: MiniFixityEnv -> NameMaker
topRecNameMaker :: MiniFixityEnv -> NameMaker
topRecNameMaker MiniFixityEnv
fix_env = TopLevelFlag -> MiniFixityEnv -> NameMaker
LetMk TopLevelFlag
TopLevel MiniFixityEnv
fix_env
isTopRecNameMaker :: NameMaker -> Bool
isTopRecNameMaker :: NameMaker -> Bool
isTopRecNameMaker (LetMk TopLevelFlag
TopLevel MiniFixityEnv
_) = Bool
True
isTopRecNameMaker NameMaker
_ = Bool
False
localRecNameMaker :: MiniFixityEnv -> NameMaker
localRecNameMaker :: MiniFixityEnv -> NameMaker
localRecNameMaker MiniFixityEnv
fix_env = TopLevelFlag -> MiniFixityEnv -> NameMaker
LetMk TopLevelFlag
NotTopLevel MiniFixityEnv
fix_env
matchNameMaker :: HsMatchContext a -> NameMaker
matchNameMaker :: HsMatchContext a -> NameMaker
matchNameMaker HsMatchContext a
ctxt = Bool -> NameMaker
LamMk Bool
report_unused
where
report_unused :: Bool
report_unused = case HsMatchContext a
ctxt of
StmtCtxt HsStmtContext a
GhciStmtCtxt -> Bool
False
HsMatchContext a
ThPatQuote -> Bool
False
HsMatchContext a
_ -> Bool
True
newPatLName :: NameMaker -> Located RdrName -> CpsRn (Located Name)
newPatLName :: NameMaker -> Located RdrName -> CpsRn (Located Name)
newPatLName NameMaker
name_maker rdr_name :: Located RdrName
rdr_name@(L SrcSpan
loc RdrName
_)
= do { Name
name <- NameMaker -> Located RdrName -> CpsRn Name
newPatName NameMaker
name_maker Located RdrName
rdr_name
; Located Name -> CpsRn (Located Name)
forall (m :: * -> *) a. Monad m => a -> m a
Instance of class: Monad of the constraint type Monad CpsRn
return (SrcSpan -> Name -> Located Name
forall l e. l -> e -> GenLocated l e
L SrcSpan
loc Name
name) }
newPatName :: NameMaker -> Located RdrName -> CpsRn Name
newPatName :: NameMaker -> Located RdrName -> CpsRn Name
newPatName (LamMk Bool
report_unused) Located RdrName
rdr_name
= (forall r. (Name -> RnM (r, FreeVars)) -> RnM (r, FreeVars))
-> CpsRn Name
forall b.
(forall r. (b -> RnM (r, FreeVars)) -> RnM (r, FreeVars))
-> CpsRn b
CpsRn (\ Name -> RnM (r, FreeVars)
thing_inside ->
do { Name
name <- Located RdrName -> RnM Name
newLocalBndrRn Located RdrName
rdr_name
; (r
res, FreeVars
fvs) <- [Name] -> RnM (r, FreeVars) -> RnM (r, FreeVars)
forall a. [Name] -> RnM a -> RnM a
bindLocalNames [Name
name] (Name -> RnM (r, FreeVars)
thing_inside Name
name)
; Bool
-> IOEnv (Env TcGblEnv TcLclEnv) ()
-> IOEnv (Env TcGblEnv TcLclEnv) ()
forall (f :: * -> *). Applicative f => Bool -> f () -> f ()
External instance of the constraint type forall m. Applicative (IOEnv m)
when Bool
report_unused (IOEnv (Env TcGblEnv TcLclEnv) ()
-> IOEnv (Env TcGblEnv TcLclEnv) ())
-> IOEnv (Env TcGblEnv TcLclEnv) ()
-> IOEnv (Env TcGblEnv TcLclEnv) ()
forall a b. (a -> b) -> a -> b
$ [Name] -> FreeVars -> IOEnv (Env TcGblEnv TcLclEnv) ()
warnUnusedMatches [Name
name] FreeVars
fvs
; (r, FreeVars) -> RnM (r, FreeVars)
forall (m :: * -> *) a. Monad m => a -> m a
External instance of the constraint type forall m. Monad (IOEnv m)
return (r
res, Name
name Name -> FreeVars -> FreeVars
`delFV` FreeVars
fvs) })
newPatName (LetMk TopLevelFlag
is_top MiniFixityEnv
fix_env) Located RdrName
rdr_name
= (forall r. (Name -> RnM (r, FreeVars)) -> RnM (r, FreeVars))
-> CpsRn Name
forall b.
(forall r. (b -> RnM (r, FreeVars)) -> RnM (r, FreeVars))
-> CpsRn b
CpsRn (\ Name -> RnM (r, FreeVars)
thing_inside ->
do { Name
name <- case TopLevelFlag
is_top of
TopLevelFlag
NotTopLevel -> Located RdrName -> RnM Name
newLocalBndrRn Located RdrName
rdr_name
TopLevelFlag
TopLevel -> Located RdrName -> RnM Name
newTopSrcBinder Located RdrName
rdr_name
; [Name] -> RnM (r, FreeVars) -> RnM (r, FreeVars)
forall a. [Name] -> RnM a -> RnM a
bindLocalNames [Name
name] (RnM (r, FreeVars) -> RnM (r, FreeVars))
-> RnM (r, FreeVars) -> RnM (r, FreeVars)
forall a b. (a -> b) -> a -> b
$
MiniFixityEnv -> [Name] -> RnM (r, FreeVars) -> RnM (r, FreeVars)
forall a. MiniFixityEnv -> [Name] -> RnM a -> RnM a
addLocalFixities MiniFixityEnv
fix_env [Name
name] (RnM (r, FreeVars) -> RnM (r, FreeVars))
-> RnM (r, FreeVars) -> RnM (r, FreeVars)
forall a b. (a -> b) -> a -> b
$
Name -> RnM (r, FreeVars)
thing_inside Name
name })
rnPats :: HsMatchContext GhcRn
-> [LPat GhcPs]
-> ([LPat GhcRn] -> RnM (a, FreeVars))
-> RnM (a, FreeVars)
rnPats :: HsMatchContext (GhcPass 'Renamed)
-> [LPat GhcPs]
-> ([LPat (GhcPass 'Renamed)] -> RnM (a, FreeVars))
-> RnM (a, FreeVars)
rnPats HsMatchContext (GhcPass 'Renamed)
ctxt [LPat GhcPs]
pats [LPat (GhcPass 'Renamed)] -> RnM (a, FreeVars)
thing_inside
= do { (GlobalRdrEnv, LocalRdrEnv)
envs_before <- TcRn (GlobalRdrEnv, LocalRdrEnv)
getRdrEnvs
; CpsRn [Located (Pat (GhcPass 'Renamed))]
-> forall r.
([Located (Pat (GhcPass 'Renamed))] -> RnM (r, FreeVars))
-> RnM (r, FreeVars)
forall b.
CpsRn b -> forall r. (b -> RnM (r, FreeVars)) -> RnM (r, FreeVars)
unCpsRn (NameMaker -> [LPat GhcPs] -> CpsRn [LPat (GhcPass 'Renamed)]
rnLPatsAndThen (HsMatchContext (GhcPass 'Renamed) -> NameMaker
forall a. HsMatchContext a -> NameMaker
matchNameMaker HsMatchContext (GhcPass 'Renamed)
ctxt) [LPat GhcPs]
pats) (([Located (Pat (GhcPass 'Renamed))] -> RnM (a, FreeVars))
-> RnM (a, FreeVars))
-> ([Located (Pat (GhcPass 'Renamed))] -> RnM (a, FreeVars))
-> RnM (a, FreeVars)
forall a b. (a -> b) -> a -> b
$ \ [Located (Pat (GhcPass 'Renamed))]
pats' -> do
{
; let bndrs :: [IdP (GhcPass 'Renamed)]
bndrs = [LPat (GhcPass 'Renamed)] -> [IdP (GhcPass 'Renamed)]
forall p. CollectPass p => [LPat p] -> [IdP p]
External instance of the constraint type CollectPass (GhcPass 'Renamed)
collectPatsBinders [Located (Pat (GhcPass 'Renamed))]
[LPat (GhcPass 'Renamed)]
pats'
; MsgDoc
-> IOEnv (Env TcGblEnv TcLclEnv) ()
-> IOEnv (Env TcGblEnv TcLclEnv) ()
forall a. MsgDoc -> TcM a -> TcM a
addErrCtxt MsgDoc
doc_pat (IOEnv (Env TcGblEnv TcLclEnv) ()
-> IOEnv (Env TcGblEnv TcLclEnv) ())
-> IOEnv (Env TcGblEnv TcLclEnv) ()
-> IOEnv (Env TcGblEnv TcLclEnv) ()
forall a b. (a -> b) -> a -> b
$
if HsMatchContext (GhcPass 'Renamed) -> Bool
forall p. HsMatchContext p -> Bool
isPatSynCtxt HsMatchContext (GhcPass 'Renamed)
ctxt
then [Name] -> IOEnv (Env TcGblEnv TcLclEnv) ()
checkDupNames [Name]
[IdP (GhcPass 'Renamed)]
bndrs
else (GlobalRdrEnv, LocalRdrEnv)
-> [Name] -> IOEnv (Env TcGblEnv TcLclEnv) ()
checkDupAndShadowedNames (GlobalRdrEnv, LocalRdrEnv)
envs_before [Name]
[IdP (GhcPass 'Renamed)]
bndrs
; [LPat (GhcPass 'Renamed)] -> RnM (a, FreeVars)
thing_inside [Located (Pat (GhcPass 'Renamed))]
[LPat (GhcPass 'Renamed)]
pats' } }
where
doc_pat :: MsgDoc
doc_pat = String -> MsgDoc
text String
"In" MsgDoc -> MsgDoc -> MsgDoc
<+> HsMatchContext (GhcPass 'Renamed) -> MsgDoc
forall p. Outputable (IdP p) => HsMatchContext p -> MsgDoc
External instance of the constraint type Outputable Name
pprMatchContext HsMatchContext (GhcPass 'Renamed)
ctxt
rnPat :: HsMatchContext GhcRn
-> LPat GhcPs
-> (LPat GhcRn -> RnM (a, FreeVars))
-> RnM (a, FreeVars)
rnPat :: HsMatchContext (GhcPass 'Renamed)
-> LPat GhcPs
-> (LPat (GhcPass 'Renamed) -> RnM (a, FreeVars))
-> RnM (a, FreeVars)
rnPat HsMatchContext (GhcPass 'Renamed)
ctxt LPat GhcPs
pat LPat (GhcPass 'Renamed) -> RnM (a, FreeVars)
thing_inside
= HsMatchContext (GhcPass 'Renamed)
-> [LPat GhcPs]
-> ([LPat (GhcPass 'Renamed)] -> RnM (a, FreeVars))
-> RnM (a, FreeVars)
forall a.
HsMatchContext (GhcPass 'Renamed)
-> [LPat GhcPs]
-> ([LPat (GhcPass 'Renamed)] -> RnM (a, FreeVars))
-> RnM (a, FreeVars)
rnPats HsMatchContext (GhcPass 'Renamed)
ctxt [LPat GhcPs
pat] (\[LPat (GhcPass 'Renamed)]
pats' -> let [Located (Pat (GhcPass 'Renamed))
pat'] = [Located (Pat (GhcPass 'Renamed))]
[LPat (GhcPass 'Renamed)]
pats' in LPat (GhcPass 'Renamed) -> RnM (a, FreeVars)
thing_inside Located (Pat (GhcPass 'Renamed))
LPat (GhcPass 'Renamed)
pat')
applyNameMaker :: NameMaker -> Located RdrName -> RnM (Located Name)
applyNameMaker :: NameMaker -> Located RdrName -> RnM (Located Name)
applyNameMaker NameMaker
mk Located RdrName
rdr = do { (Located Name
n, FreeVars
_fvs) <- CpsRn (Located Name) -> RnM (Located Name, FreeVars)
forall a. CpsRn a -> RnM (a, FreeVars)
runCps (NameMaker -> Located RdrName -> CpsRn (Located Name)
newPatLName NameMaker
mk Located RdrName
rdr)
; Located Name -> RnM (Located Name)
forall (m :: * -> *) a. Monad m => a -> m a
External instance of the constraint type forall m. Monad (IOEnv m)
return Located Name
n }
rnBindPat :: NameMaker
-> LPat GhcPs
-> RnM (LPat GhcRn, FreeVars)
rnBindPat :: NameMaker -> LPat GhcPs -> RnM (LPat (GhcPass 'Renamed), FreeVars)
rnBindPat NameMaker
name_maker LPat GhcPs
pat = CpsRn (Located (Pat (GhcPass 'Renamed)))
-> RnM (Located (Pat (GhcPass 'Renamed)), FreeVars)
forall a. CpsRn a -> RnM (a, FreeVars)
runCps (NameMaker -> LPat GhcPs -> CpsRn (LPat (GhcPass 'Renamed))
rnLPatAndThen NameMaker
name_maker LPat GhcPs
pat)
rnLPatsAndThen :: NameMaker -> [LPat GhcPs] -> CpsRn [LPat GhcRn]
rnLPatsAndThen :: NameMaker -> [LPat GhcPs] -> CpsRn [LPat (GhcPass 'Renamed)]
rnLPatsAndThen NameMaker
mk = (Located (Pat GhcPs) -> CpsRn (Located (Pat (GhcPass 'Renamed))))
-> [Located (Pat GhcPs)]
-> CpsRn [Located (Pat (GhcPass 'Renamed))]
forall (t :: * -> *) (m :: * -> *) a b.
(Traversable t, Monad m) =>
(a -> m b) -> t a -> m (t b)
Instance of class: Monad of the constraint type Monad CpsRn
External instance of the constraint type Traversable []
mapM (NameMaker -> LPat GhcPs -> CpsRn (LPat (GhcPass 'Renamed))
rnLPatAndThen NameMaker
mk)
rnLPatAndThen :: NameMaker -> LPat GhcPs -> CpsRn (LPat GhcRn)
rnLPatAndThen :: NameMaker -> LPat GhcPs -> CpsRn (LPat (GhcPass 'Renamed))
rnLPatAndThen NameMaker
nm LPat GhcPs
lpat = (Pat GhcPs -> CpsRn (Pat (GhcPass 'Renamed)))
-> Located (Pat GhcPs) -> CpsRn (Located (Pat (GhcPass 'Renamed)))
forall a b. (a -> CpsRn b) -> Located a -> CpsRn (Located b)
wrapSrcSpanCps (NameMaker -> Pat GhcPs -> CpsRn (Pat (GhcPass 'Renamed))
rnPatAndThen NameMaker
nm) Located (Pat GhcPs)
LPat GhcPs
lpat
rnPatAndThen :: NameMaker -> Pat GhcPs -> CpsRn (Pat GhcRn)
rnPatAndThen :: NameMaker -> Pat GhcPs -> CpsRn (Pat (GhcPass 'Renamed))
rnPatAndThen NameMaker
_ (WildPat XWildPat GhcPs
_) = Pat (GhcPass 'Renamed) -> CpsRn (Pat (GhcPass 'Renamed))
forall (m :: * -> *) a. Monad m => a -> m a
Instance of class: Monad of the constraint type Monad CpsRn
return (XWildPat (GhcPass 'Renamed) -> Pat (GhcPass 'Renamed)
forall p. XWildPat p -> Pat p
WildPat XWildPat (GhcPass 'Renamed)
NoExtField
noExtField)
rnPatAndThen NameMaker
mk (ParPat XParPat GhcPs
x LPat GhcPs
pat) = do { Located (Pat (GhcPass 'Renamed))
pat' <- NameMaker -> LPat GhcPs -> CpsRn (LPat (GhcPass 'Renamed))
rnLPatAndThen NameMaker
mk LPat GhcPs
pat
; Pat (GhcPass 'Renamed) -> CpsRn (Pat (GhcPass 'Renamed))
forall (m :: * -> *) a. Monad m => a -> m a
Instance of class: Monad of the constraint type Monad CpsRn
return (XParPat (GhcPass 'Renamed)
-> LPat (GhcPass 'Renamed) -> Pat (GhcPass 'Renamed)
forall p. XParPat p -> LPat p -> Pat p
ParPat XParPat GhcPs
XParPat (GhcPass 'Renamed)
x Located (Pat (GhcPass 'Renamed))
LPat (GhcPass 'Renamed)
pat') }
rnPatAndThen NameMaker
mk (LazyPat XLazyPat GhcPs
x LPat GhcPs
pat) = do { Located (Pat (GhcPass 'Renamed))
pat' <- NameMaker -> LPat GhcPs -> CpsRn (LPat (GhcPass 'Renamed))
rnLPatAndThen NameMaker
mk LPat GhcPs
pat
; Pat (GhcPass 'Renamed) -> CpsRn (Pat (GhcPass 'Renamed))
forall (m :: * -> *) a. Monad m => a -> m a
Instance of class: Monad of the constraint type Monad CpsRn
return (XLazyPat (GhcPass 'Renamed)
-> LPat (GhcPass 'Renamed) -> Pat (GhcPass 'Renamed)
forall p. XLazyPat p -> LPat p -> Pat p
LazyPat XLazyPat GhcPs
XLazyPat (GhcPass 'Renamed)
x Located (Pat (GhcPass 'Renamed))
LPat (GhcPass 'Renamed)
pat') }
rnPatAndThen NameMaker
mk (BangPat XBangPat GhcPs
x LPat GhcPs
pat) = do { Located (Pat (GhcPass 'Renamed))
pat' <- NameMaker -> LPat GhcPs -> CpsRn (LPat (GhcPass 'Renamed))
rnLPatAndThen NameMaker
mk LPat GhcPs
pat
; Pat (GhcPass 'Renamed) -> CpsRn (Pat (GhcPass 'Renamed))
forall (m :: * -> *) a. Monad m => a -> m a
Instance of class: Monad of the constraint type Monad CpsRn
return (XBangPat (GhcPass 'Renamed)
-> LPat (GhcPass 'Renamed) -> Pat (GhcPass 'Renamed)
forall p. XBangPat p -> LPat p -> Pat p
BangPat XBangPat GhcPs
XBangPat (GhcPass 'Renamed)
x Located (Pat (GhcPass 'Renamed))
LPat (GhcPass 'Renamed)
pat') }
rnPatAndThen NameMaker
mk (VarPat XVarPat GhcPs
x (L SrcSpan
l IdP GhcPs
rdr))
= do { SrcSpan
loc <- RnM SrcSpan -> CpsRn SrcSpan
forall a. RnM a -> CpsRn a
liftCps RnM SrcSpan
getSrcSpanM
; Name
name <- NameMaker -> Located RdrName -> CpsRn Name
newPatName NameMaker
mk (SrcSpan -> RdrName -> Located RdrName
forall l e. l -> e -> GenLocated l e
L SrcSpan
loc RdrName
IdP GhcPs
rdr)
; Pat (GhcPass 'Renamed) -> CpsRn (Pat (GhcPass 'Renamed))
forall (m :: * -> *) a. Monad m => a -> m a
Instance of class: Monad of the constraint type Monad CpsRn
return (XVarPat (GhcPass 'Renamed)
-> Located (IdP (GhcPass 'Renamed)) -> Pat (GhcPass 'Renamed)
forall p. XVarPat p -> Located (IdP p) -> Pat p
VarPat XVarPat GhcPs
XVarPat (GhcPass 'Renamed)
x (SrcSpan -> Name -> Located Name
forall l e. l -> e -> GenLocated l e
L SrcSpan
l Name
name)) }
rnPatAndThen NameMaker
mk (SigPat XSigPat GhcPs
x LPat GhcPs
pat HsPatSigType (NoGhcTc GhcPs)
sig)
= do { HsPatSigType (GhcPass 'Renamed)
sig' <- HsPatSigType GhcPs -> CpsRn (HsPatSigType (GhcPass 'Renamed))
rnHsPatSigTypeAndThen HsPatSigType (NoGhcTc GhcPs)
HsPatSigType GhcPs
sig
; Located (Pat (GhcPass 'Renamed))
pat' <- NameMaker -> LPat GhcPs -> CpsRn (LPat (GhcPass 'Renamed))
rnLPatAndThen NameMaker
mk LPat GhcPs
pat
; Pat (GhcPass 'Renamed) -> CpsRn (Pat (GhcPass 'Renamed))
forall (m :: * -> *) a. Monad m => a -> m a
Instance of class: Monad of the constraint type Monad CpsRn
return (XSigPat (GhcPass 'Renamed)
-> LPat (GhcPass 'Renamed)
-> HsPatSigType (NoGhcTc (GhcPass 'Renamed))
-> Pat (GhcPass 'Renamed)
forall p. XSigPat p -> LPat p -> HsPatSigType (NoGhcTc p) -> Pat p
SigPat XSigPat GhcPs
XSigPat (GhcPass 'Renamed)
x Located (Pat (GhcPass 'Renamed))
LPat (GhcPass 'Renamed)
pat' HsPatSigType (NoGhcTc (GhcPass 'Renamed))
HsPatSigType (GhcPass 'Renamed)
sig' ) }
where
rnHsPatSigTypeAndThen :: HsPatSigType GhcPs -> CpsRn (HsPatSigType GhcRn)
rnHsPatSigTypeAndThen :: HsPatSigType GhcPs -> CpsRn (HsPatSigType (GhcPass 'Renamed))
rnHsPatSigTypeAndThen HsPatSigType GhcPs
sig = (forall r.
(HsPatSigType (GhcPass 'Renamed) -> RnM (r, FreeVars))
-> RnM (r, FreeVars))
-> CpsRn (HsPatSigType (GhcPass 'Renamed))
forall b.
(forall r. (b -> RnM (r, FreeVars)) -> RnM (r, FreeVars))
-> CpsRn b
CpsRn (HsSigWcTypeScoping
-> HsDocContext
-> Maybe MsgDoc
-> HsPatSigType GhcPs
-> (HsPatSigType (GhcPass 'Renamed) -> RnM (r, FreeVars))
-> RnM (r, FreeVars)
forall a.
HsSigWcTypeScoping
-> HsDocContext
-> Maybe MsgDoc
-> HsPatSigType GhcPs
-> (HsPatSigType (GhcPass 'Renamed) -> RnM (a, FreeVars))
-> RnM (a, FreeVars)
rnHsPatSigType HsSigWcTypeScoping
AlwaysBind HsDocContext
PatCtx Maybe MsgDoc
forall a. Maybe a
Nothing HsPatSigType GhcPs
sig)
rnPatAndThen NameMaker
mk (LitPat XLitPat GhcPs
x HsLit GhcPs
lit)
| HsString XHsString GhcPs
src FastString
s <- HsLit GhcPs
lit
= do { Bool
ovlStr <- RnM Bool -> CpsRn Bool
forall a. RnM a -> CpsRn a
liftCps (Extension -> RnM Bool
forall gbl lcl. Extension -> TcRnIf gbl lcl Bool
xoptM Extension
LangExt.OverloadedStrings)
; if Bool
ovlStr
then NameMaker -> Pat GhcPs -> CpsRn (Pat (GhcPass 'Renamed))
rnPatAndThen NameMaker
mk
(Located (HsOverLit GhcPs) -> Maybe (SyntaxExpr GhcPs) -> Pat GhcPs
mkNPat (HsOverLit GhcPs -> Located (HsOverLit GhcPs)
forall e. e -> Located e
noLoc (SourceText -> FastString -> HsOverLit GhcPs
mkHsIsString SourceText
XHsString GhcPs
src FastString
s))
Maybe (SyntaxExpr GhcPs)
forall a. Maybe a
Nothing)
else CpsRn (Pat (GhcPass 'Renamed))
normal_lit }
| Bool
otherwise = CpsRn (Pat (GhcPass 'Renamed))
normal_lit
where
normal_lit :: CpsRn (Pat (GhcPass 'Renamed))
normal_lit = do { IOEnv (Env TcGblEnv TcLclEnv) () -> CpsRn ()
forall a. RnM a -> CpsRn a
liftCps (HsLit GhcPs -> IOEnv (Env TcGblEnv TcLclEnv) ()
forall p. HsLit p -> IOEnv (Env TcGblEnv TcLclEnv) ()
rnLit HsLit GhcPs
lit); Pat (GhcPass 'Renamed) -> CpsRn (Pat (GhcPass 'Renamed))
forall (m :: * -> *) a. Monad m => a -> m a
Instance of class: Monad of the constraint type Monad CpsRn
return (XLitPat (GhcPass 'Renamed)
-> HsLit (GhcPass 'Renamed) -> Pat (GhcPass 'Renamed)
forall p. XLitPat p -> HsLit p -> Pat p
LitPat XLitPat GhcPs
XLitPat (GhcPass 'Renamed)
x (HsLit GhcPs -> HsLit (GhcPass 'Renamed)
forall (p1 :: Pass) (p2 :: Pass).
HsLit (GhcPass p1) -> HsLit (GhcPass p2)
convertLit HsLit GhcPs
lit)) }
rnPatAndThen NameMaker
_ (NPat XNPat GhcPs
x (L SrcSpan
l HsOverLit GhcPs
lit) Maybe (SyntaxExpr GhcPs)
mb_neg SyntaxExpr GhcPs
_eq)
= do { (HsOverLit (GhcPass 'Renamed)
lit', Maybe (HsExpr (GhcPass 'Renamed))
mb_neg') <- RnM
((HsOverLit (GhcPass 'Renamed), Maybe (HsExpr (GhcPass 'Renamed))),
FreeVars)
-> CpsRn
(HsOverLit (GhcPass 'Renamed), Maybe (HsExpr (GhcPass 'Renamed)))
forall a. RnM (a, FreeVars) -> CpsRn a
liftCpsFV (RnM
((HsOverLit (GhcPass 'Renamed), Maybe (HsExpr (GhcPass 'Renamed))),
FreeVars)
-> CpsRn
(HsOverLit (GhcPass 'Renamed), Maybe (HsExpr (GhcPass 'Renamed))))
-> RnM
((HsOverLit (GhcPass 'Renamed), Maybe (HsExpr (GhcPass 'Renamed))),
FreeVars)
-> CpsRn
(HsOverLit (GhcPass 'Renamed), Maybe (HsExpr (GhcPass 'Renamed)))
forall a b. (a -> b) -> a -> b
$ HsOverLit GhcPs
-> RnM
((HsOverLit (GhcPass 'Renamed), Maybe (HsExpr (GhcPass 'Renamed))),
FreeVars)
forall t.
HsOverLit t
-> RnM
((HsOverLit (GhcPass 'Renamed), Maybe (HsExpr (GhcPass 'Renamed))),
FreeVars)
rnOverLit HsOverLit GhcPs
lit
; Maybe SyntaxExprRn
mb_neg'
<- let negative :: IOEnv (Env TcGblEnv TcLclEnv) (Maybe SyntaxExprRn, FreeVars)
negative = do { (SyntaxExprRn
neg, FreeVars
fvs) <- Name -> RnM (SyntaxExpr (GhcPass 'Renamed), FreeVars)
lookupSyntax Name
negateName
; (Maybe SyntaxExprRn, FreeVars)
-> IOEnv (Env TcGblEnv TcLclEnv) (Maybe SyntaxExprRn, FreeVars)
forall (m :: * -> *) a. Monad m => a -> m a
External instance of the constraint type forall m. Monad (IOEnv m)
return (SyntaxExprRn -> Maybe SyntaxExprRn
forall a. a -> Maybe a
Just SyntaxExprRn
neg, FreeVars
fvs) }
positive :: IOEnv (Env TcGblEnv TcLclEnv) (Maybe a, FreeVars)
positive = (Maybe a, FreeVars)
-> IOEnv (Env TcGblEnv TcLclEnv) (Maybe a, FreeVars)
forall (m :: * -> *) a. Monad m => a -> m a
External instance of the constraint type forall m. Monad (IOEnv m)
return (Maybe a
forall a. Maybe a
Nothing, FreeVars
emptyFVs)
in IOEnv (Env TcGblEnv TcLclEnv) (Maybe SyntaxExprRn, FreeVars)
-> CpsRn (Maybe SyntaxExprRn)
forall a. RnM (a, FreeVars) -> CpsRn a
liftCpsFV (IOEnv (Env TcGblEnv TcLclEnv) (Maybe SyntaxExprRn, FreeVars)
-> CpsRn (Maybe SyntaxExprRn))
-> IOEnv (Env TcGblEnv TcLclEnv) (Maybe SyntaxExprRn, FreeVars)
-> CpsRn (Maybe SyntaxExprRn)
forall a b. (a -> b) -> a -> b
$ case (Maybe NoExtField
Maybe (SyntaxExpr GhcPs)
mb_neg , Maybe (HsExpr (GhcPass 'Renamed))
mb_neg') of
(Maybe NoExtField
Nothing, Just HsExpr (GhcPass 'Renamed)
_ ) -> IOEnv (Env TcGblEnv TcLclEnv) (Maybe SyntaxExprRn, FreeVars)
negative
(Just NoExtField
_ , Maybe (HsExpr (GhcPass 'Renamed))
Nothing) -> IOEnv (Env TcGblEnv TcLclEnv) (Maybe SyntaxExprRn, FreeVars)
negative
(Maybe NoExtField
Nothing, Maybe (HsExpr (GhcPass 'Renamed))
Nothing) -> IOEnv (Env TcGblEnv TcLclEnv) (Maybe SyntaxExprRn, FreeVars)
forall {a}. IOEnv (Env TcGblEnv TcLclEnv) (Maybe a, FreeVars)
positive
(Just NoExtField
_ , Just HsExpr (GhcPass 'Renamed)
_ ) -> IOEnv (Env TcGblEnv TcLclEnv) (Maybe SyntaxExprRn, FreeVars)
forall {a}. IOEnv (Env TcGblEnv TcLclEnv) (Maybe a, FreeVars)
positive
; SyntaxExprRn
eq' <- IOEnv (Env TcGblEnv TcLclEnv) (SyntaxExprRn, FreeVars)
-> CpsRn SyntaxExprRn
forall a. RnM (a, FreeVars) -> CpsRn a
liftCpsFV (IOEnv (Env TcGblEnv TcLclEnv) (SyntaxExprRn, FreeVars)
-> CpsRn SyntaxExprRn)
-> IOEnv (Env TcGblEnv TcLclEnv) (SyntaxExprRn, FreeVars)
-> CpsRn SyntaxExprRn
forall a b. (a -> b) -> a -> b
$ Name -> RnM (SyntaxExpr (GhcPass 'Renamed), FreeVars)
lookupSyntax Name
eqName
; Pat (GhcPass 'Renamed) -> CpsRn (Pat (GhcPass 'Renamed))
forall (m :: * -> *) a. Monad m => a -> m a
Instance of class: Monad of the constraint type Monad CpsRn
return (XNPat (GhcPass 'Renamed)
-> Located (HsOverLit (GhcPass 'Renamed))
-> Maybe (SyntaxExpr (GhcPass 'Renamed))
-> SyntaxExpr (GhcPass 'Renamed)
-> Pat (GhcPass 'Renamed)
forall p.
XNPat p
-> Located (HsOverLit p)
-> Maybe (SyntaxExpr p)
-> SyntaxExpr p
-> Pat p
NPat XNPat GhcPs
XNPat (GhcPass 'Renamed)
x (SrcSpan
-> HsOverLit (GhcPass 'Renamed)
-> Located (HsOverLit (GhcPass 'Renamed))
forall l e. l -> e -> GenLocated l e
L SrcSpan
l HsOverLit (GhcPass 'Renamed)
lit') Maybe (SyntaxExpr (GhcPass 'Renamed))
Maybe SyntaxExprRn
mb_neg' SyntaxExpr (GhcPass 'Renamed)
SyntaxExprRn
eq') }
rnPatAndThen NameMaker
mk (NPlusKPat XNPlusKPat GhcPs
x GenLocated SrcSpan (IdP GhcPs)
rdr (L SrcSpan
l HsOverLit GhcPs
lit) HsOverLit GhcPs
_ SyntaxExpr GhcPs
_ SyntaxExpr GhcPs
_ )
= do { Name
new_name <- NameMaker -> Located RdrName -> CpsRn Name
newPatName NameMaker
mk Located RdrName
GenLocated SrcSpan (IdP GhcPs)
rdr
; (HsOverLit (GhcPass 'Renamed)
lit', Maybe (HsExpr (GhcPass 'Renamed))
_) <- RnM
((HsOverLit (GhcPass 'Renamed), Maybe (HsExpr (GhcPass 'Renamed))),
FreeVars)
-> CpsRn
(HsOverLit (GhcPass 'Renamed), Maybe (HsExpr (GhcPass 'Renamed)))
forall a. RnM (a, FreeVars) -> CpsRn a
liftCpsFV (RnM
((HsOverLit (GhcPass 'Renamed), Maybe (HsExpr (GhcPass 'Renamed))),
FreeVars)
-> CpsRn
(HsOverLit (GhcPass 'Renamed), Maybe (HsExpr (GhcPass 'Renamed))))
-> RnM
((HsOverLit (GhcPass 'Renamed), Maybe (HsExpr (GhcPass 'Renamed))),
FreeVars)
-> CpsRn
(HsOverLit (GhcPass 'Renamed), Maybe (HsExpr (GhcPass 'Renamed)))
forall a b. (a -> b) -> a -> b
$ HsOverLit GhcPs
-> RnM
((HsOverLit (GhcPass 'Renamed), Maybe (HsExpr (GhcPass 'Renamed))),
FreeVars)
forall t.
HsOverLit t
-> RnM
((HsOverLit (GhcPass 'Renamed), Maybe (HsExpr (GhcPass 'Renamed))),
FreeVars)
rnOverLit HsOverLit GhcPs
lit
; SyntaxExprRn
minus <- IOEnv (Env TcGblEnv TcLclEnv) (SyntaxExprRn, FreeVars)
-> CpsRn SyntaxExprRn
forall a. RnM (a, FreeVars) -> CpsRn a
liftCpsFV (IOEnv (Env TcGblEnv TcLclEnv) (SyntaxExprRn, FreeVars)
-> CpsRn SyntaxExprRn)
-> IOEnv (Env TcGblEnv TcLclEnv) (SyntaxExprRn, FreeVars)
-> CpsRn SyntaxExprRn
forall a b. (a -> b) -> a -> b
$ Name -> RnM (SyntaxExpr (GhcPass 'Renamed), FreeVars)
lookupSyntax Name
minusName
; SyntaxExprRn
ge <- IOEnv (Env TcGblEnv TcLclEnv) (SyntaxExprRn, FreeVars)
-> CpsRn SyntaxExprRn
forall a. RnM (a, FreeVars) -> CpsRn a
liftCpsFV (IOEnv (Env TcGblEnv TcLclEnv) (SyntaxExprRn, FreeVars)
-> CpsRn SyntaxExprRn)
-> IOEnv (Env TcGblEnv TcLclEnv) (SyntaxExprRn, FreeVars)
-> CpsRn SyntaxExprRn
forall a b. (a -> b) -> a -> b
$ Name -> RnM (SyntaxExpr (GhcPass 'Renamed), FreeVars)
lookupSyntax Name
geName
; Pat (GhcPass 'Renamed) -> CpsRn (Pat (GhcPass 'Renamed))
forall (m :: * -> *) a. Monad m => a -> m a
Instance of class: Monad of the constraint type Monad CpsRn
return (XNPlusKPat (GhcPass 'Renamed)
-> Located (IdP (GhcPass 'Renamed))
-> Located (HsOverLit (GhcPass 'Renamed))
-> HsOverLit (GhcPass 'Renamed)
-> SyntaxExpr (GhcPass 'Renamed)
-> SyntaxExpr (GhcPass 'Renamed)
-> Pat (GhcPass 'Renamed)
forall p.
XNPlusKPat p
-> Located (IdP p)
-> Located (HsOverLit p)
-> HsOverLit p
-> SyntaxExpr p
-> SyntaxExpr p
-> Pat p
NPlusKPat XNPlusKPat GhcPs
XNPlusKPat (GhcPass 'Renamed)
x (SrcSpan -> Name -> Located Name
forall l e. l -> e -> GenLocated l e
L (Name -> SrcSpan
nameSrcSpan Name
new_name) Name
new_name)
(SrcSpan
-> HsOverLit (GhcPass 'Renamed)
-> Located (HsOverLit (GhcPass 'Renamed))
forall l e. l -> e -> GenLocated l e
L SrcSpan
l HsOverLit (GhcPass 'Renamed)
lit') HsOverLit (GhcPass 'Renamed)
lit' SyntaxExpr (GhcPass 'Renamed)
SyntaxExprRn
ge SyntaxExpr (GhcPass 'Renamed)
SyntaxExprRn
minus) }
rnPatAndThen NameMaker
mk (AsPat XAsPat GhcPs
x GenLocated SrcSpan (IdP GhcPs)
rdr LPat GhcPs
pat)
= do { Located Name
new_name <- NameMaker -> Located RdrName -> CpsRn (Located Name)
newPatLName NameMaker
mk Located RdrName
GenLocated SrcSpan (IdP GhcPs)
rdr
; Located (Pat (GhcPass 'Renamed))
pat' <- NameMaker -> LPat GhcPs -> CpsRn (LPat (GhcPass 'Renamed))
rnLPatAndThen NameMaker
mk LPat GhcPs
pat
; Pat (GhcPass 'Renamed) -> CpsRn (Pat (GhcPass 'Renamed))
forall (m :: * -> *) a. Monad m => a -> m a
Instance of class: Monad of the constraint type Monad CpsRn
return (XAsPat (GhcPass 'Renamed)
-> Located (IdP (GhcPass 'Renamed))
-> LPat (GhcPass 'Renamed)
-> Pat (GhcPass 'Renamed)
forall p. XAsPat p -> Located (IdP p) -> LPat p -> Pat p
AsPat XAsPat GhcPs
XAsPat (GhcPass 'Renamed)
x Located Name
Located (IdP (GhcPass 'Renamed))
new_name Located (Pat (GhcPass 'Renamed))
LPat (GhcPass 'Renamed)
pat') }
rnPatAndThen NameMaker
mk p :: Pat GhcPs
p@(ViewPat XViewPat GhcPs
x LHsExpr GhcPs
expr LPat GhcPs
pat)
= do { IOEnv (Env TcGblEnv TcLclEnv) () -> CpsRn ()
forall a. RnM a -> CpsRn a
liftCps (IOEnv (Env TcGblEnv TcLclEnv) () -> CpsRn ())
-> IOEnv (Env TcGblEnv TcLclEnv) () -> CpsRn ()
forall a b. (a -> b) -> a -> b
$ do { Bool
vp_flag <- Extension -> RnM Bool
forall gbl lcl. Extension -> TcRnIf gbl lcl Bool
xoptM Extension
LangExt.ViewPatterns
; Bool -> MsgDoc -> IOEnv (Env TcGblEnv TcLclEnv) ()
checkErr Bool
vp_flag (Pat GhcPs -> MsgDoc
badViewPat Pat GhcPs
p) }
; LHsExpr (GhcPass 'Renamed)
expr' <- RnM (LHsExpr (GhcPass 'Renamed), FreeVars)
-> CpsRn (LHsExpr (GhcPass 'Renamed))
forall a. RnM (a, FreeVars) -> CpsRn a
liftCpsFV (RnM (LHsExpr (GhcPass 'Renamed), FreeVars)
-> CpsRn (LHsExpr (GhcPass 'Renamed)))
-> RnM (LHsExpr (GhcPass 'Renamed), FreeVars)
-> CpsRn (LHsExpr (GhcPass 'Renamed))
forall a b. (a -> b) -> a -> b
$ LHsExpr GhcPs -> RnM (LHsExpr (GhcPass 'Renamed), FreeVars)
rnLExpr LHsExpr GhcPs
expr
; Located (Pat (GhcPass 'Renamed))
pat' <- NameMaker -> LPat GhcPs -> CpsRn (LPat (GhcPass 'Renamed))
rnLPatAndThen NameMaker
mk LPat GhcPs
pat
; Pat (GhcPass 'Renamed) -> CpsRn (Pat (GhcPass 'Renamed))
forall (m :: * -> *) a. Monad m => a -> m a
Instance of class: Monad of the constraint type Monad CpsRn
return (XViewPat (GhcPass 'Renamed)
-> LHsExpr (GhcPass 'Renamed)
-> LPat (GhcPass 'Renamed)
-> Pat (GhcPass 'Renamed)
forall p. XViewPat p -> LHsExpr p -> LPat p -> Pat p
ViewPat XViewPat GhcPs
XViewPat (GhcPass 'Renamed)
x LHsExpr (GhcPass 'Renamed)
expr' Located (Pat (GhcPass 'Renamed))
LPat (GhcPass 'Renamed)
pat') }
rnPatAndThen NameMaker
mk (ConPat XConPat GhcPs
NoExtField
NoExtField Located (ConLikeP GhcPs)
con HsConPatDetails GhcPs
args)
= case Located RdrName -> RdrName
forall l e. GenLocated l e -> e
unLoc Located RdrName
Located (ConLikeP GhcPs)
con RdrName -> RdrName -> Bool
forall a. Eq a => a -> a -> Bool
External instance of the constraint type Eq RdrName
== Name -> RdrName
nameRdrName (DataCon -> Name
dataConName DataCon
nilDataCon) of
Bool
True -> do { Bool
ol_flag <- RnM Bool -> CpsRn Bool
forall a. RnM a -> CpsRn a
liftCps (RnM Bool -> CpsRn Bool) -> RnM Bool -> CpsRn Bool
forall a b. (a -> b) -> a -> b
$ Extension -> RnM Bool
forall gbl lcl. Extension -> TcRnIf gbl lcl Bool
xoptM Extension
LangExt.OverloadedLists
; if Bool
ol_flag then NameMaker -> Pat GhcPs -> CpsRn (Pat (GhcPass 'Renamed))
rnPatAndThen NameMaker
mk (XListPat GhcPs -> [LPat GhcPs] -> Pat GhcPs
forall p. XListPat p -> [LPat p] -> Pat p
ListPat XListPat GhcPs
NoExtField
noExtField [])
else NameMaker
-> Located RdrName
-> HsConPatDetails GhcPs
-> CpsRn (Pat (GhcPass 'Renamed))
rnConPatAndThen NameMaker
mk Located RdrName
Located (ConLikeP GhcPs)
con HsConPatDetails GhcPs
args}
Bool
False -> NameMaker
-> Located RdrName
-> HsConPatDetails GhcPs
-> CpsRn (Pat (GhcPass 'Renamed))
rnConPatAndThen NameMaker
mk Located RdrName
Located (ConLikeP GhcPs)
con HsConPatDetails GhcPs
args
rnPatAndThen NameMaker
mk (ListPat XListPat GhcPs
_ [LPat GhcPs]
pats)
= do { Bool
opt_OverloadedLists <- RnM Bool -> CpsRn Bool
forall a. RnM a -> CpsRn a
liftCps (RnM Bool -> CpsRn Bool) -> RnM Bool -> CpsRn Bool
forall a b. (a -> b) -> a -> b
$ Extension -> RnM Bool
forall gbl lcl. Extension -> TcRnIf gbl lcl Bool
xoptM Extension
LangExt.OverloadedLists
; [Located (Pat (GhcPass 'Renamed))]
pats' <- NameMaker -> [LPat GhcPs] -> CpsRn [LPat (GhcPass 'Renamed)]
rnLPatsAndThen NameMaker
mk [LPat GhcPs]
pats
; case Bool
opt_OverloadedLists of
Bool
True -> do { (SyntaxExprRn
to_list_name,FreeVars
_) <- IOEnv (Env TcGblEnv TcLclEnv) (SyntaxExprRn, FreeVars)
-> CpsRn (SyntaxExprRn, FreeVars)
forall a. RnM a -> CpsRn a
liftCps (IOEnv (Env TcGblEnv TcLclEnv) (SyntaxExprRn, FreeVars)
-> CpsRn (SyntaxExprRn, FreeVars))
-> IOEnv (Env TcGblEnv TcLclEnv) (SyntaxExprRn, FreeVars)
-> CpsRn (SyntaxExprRn, FreeVars)
forall a b. (a -> b) -> a -> b
$ Name -> RnM (SyntaxExpr (GhcPass 'Renamed), FreeVars)
lookupSyntax Name
toListName
; Pat (GhcPass 'Renamed) -> CpsRn (Pat (GhcPass 'Renamed))
forall (m :: * -> *) a. Monad m => a -> m a
Instance of class: Monad of the constraint type Monad CpsRn
return (XListPat (GhcPass 'Renamed)
-> [LPat (GhcPass 'Renamed)] -> Pat (GhcPass 'Renamed)
forall p. XListPat p -> [LPat p] -> Pat p
ListPat (SyntaxExprRn -> Maybe SyntaxExprRn
forall a. a -> Maybe a
Just SyntaxExprRn
to_list_name) [Located (Pat (GhcPass 'Renamed))]
[LPat (GhcPass 'Renamed)]
pats')}
Bool
False -> Pat (GhcPass 'Renamed) -> CpsRn (Pat (GhcPass 'Renamed))
forall (m :: * -> *) a. Monad m => a -> m a
Instance of class: Monad of the constraint type Monad CpsRn
return (XListPat (GhcPass 'Renamed)
-> [LPat (GhcPass 'Renamed)] -> Pat (GhcPass 'Renamed)
forall p. XListPat p -> [LPat p] -> Pat p
ListPat XListPat (GhcPass 'Renamed)
forall a. Maybe a
Nothing [Located (Pat (GhcPass 'Renamed))]
[LPat (GhcPass 'Renamed)]
pats') }
rnPatAndThen NameMaker
mk (TuplePat XTuplePat GhcPs
x [LPat GhcPs]
pats Boxity
boxed)
= do { IOEnv (Env TcGblEnv TcLclEnv) () -> CpsRn ()
forall a. RnM a -> CpsRn a
liftCps (IOEnv (Env TcGblEnv TcLclEnv) () -> CpsRn ())
-> IOEnv (Env TcGblEnv TcLclEnv) () -> CpsRn ()
forall a b. (a -> b) -> a -> b
$ Int -> IOEnv (Env TcGblEnv TcLclEnv) ()
checkTupSize ([Located (Pat GhcPs)] -> Int
forall (t :: * -> *) a. Foldable t => t a -> Int
External instance of the constraint type Foldable []
length [Located (Pat GhcPs)]
[LPat GhcPs]
pats)
; [Located (Pat (GhcPass 'Renamed))]
pats' <- NameMaker -> [LPat GhcPs] -> CpsRn [LPat (GhcPass 'Renamed)]
rnLPatsAndThen NameMaker
mk [LPat GhcPs]
pats
; Pat (GhcPass 'Renamed) -> CpsRn (Pat (GhcPass 'Renamed))
forall (m :: * -> *) a. Monad m => a -> m a
Instance of class: Monad of the constraint type Monad CpsRn
return (XTuplePat (GhcPass 'Renamed)
-> [LPat (GhcPass 'Renamed)] -> Boxity -> Pat (GhcPass 'Renamed)
forall p. XTuplePat p -> [LPat p] -> Boxity -> Pat p
TuplePat XTuplePat GhcPs
XTuplePat (GhcPass 'Renamed)
x [Located (Pat (GhcPass 'Renamed))]
[LPat (GhcPass 'Renamed)]
pats' Boxity
boxed) }
rnPatAndThen NameMaker
mk (SumPat XSumPat GhcPs
x LPat GhcPs
pat Int
alt Int
arity)
= do { Located (Pat (GhcPass 'Renamed))
pat <- NameMaker -> LPat GhcPs -> CpsRn (LPat (GhcPass 'Renamed))
rnLPatAndThen NameMaker
mk LPat GhcPs
pat
; Pat (GhcPass 'Renamed) -> CpsRn (Pat (GhcPass 'Renamed))
forall (m :: * -> *) a. Monad m => a -> m a
Instance of class: Monad of the constraint type Monad CpsRn
return (XSumPat (GhcPass 'Renamed)
-> LPat (GhcPass 'Renamed) -> Int -> Int -> Pat (GhcPass 'Renamed)
forall p. XSumPat p -> LPat p -> Int -> Int -> Pat p
SumPat XSumPat GhcPs
XSumPat (GhcPass 'Renamed)
x Located (Pat (GhcPass 'Renamed))
LPat (GhcPass 'Renamed)
pat Int
alt Int
arity)
}
rnPatAndThen NameMaker
mk (SplicePat XSplicePat GhcPs
x (HsSpliced XSpliced GhcPs
x2 ThModFinalizers
mfs (HsSplicedPat Pat GhcPs
pat)))
= XSplicePat (GhcPass 'Renamed)
-> HsSplice (GhcPass 'Renamed) -> Pat (GhcPass 'Renamed)
forall p. XSplicePat p -> HsSplice p -> Pat p
SplicePat XSplicePat GhcPs
XSplicePat (GhcPass 'Renamed)
x (HsSplice (GhcPass 'Renamed) -> Pat (GhcPass 'Renamed))
-> (Pat (GhcPass 'Renamed) -> HsSplice (GhcPass 'Renamed))
-> Pat (GhcPass 'Renamed)
-> Pat (GhcPass 'Renamed)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. XSpliced (GhcPass 'Renamed)
-> ThModFinalizers
-> HsSplicedThing (GhcPass 'Renamed)
-> HsSplice (GhcPass 'Renamed)
forall id.
XSpliced id -> ThModFinalizers -> HsSplicedThing id -> HsSplice id
HsSpliced XSpliced GhcPs
XSpliced (GhcPass 'Renamed)
x2 ThModFinalizers
mfs (HsSplicedThing (GhcPass 'Renamed) -> HsSplice (GhcPass 'Renamed))
-> (Pat (GhcPass 'Renamed) -> HsSplicedThing (GhcPass 'Renamed))
-> Pat (GhcPass 'Renamed)
-> HsSplice (GhcPass 'Renamed)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Pat (GhcPass 'Renamed) -> HsSplicedThing (GhcPass 'Renamed)
forall id. Pat id -> HsSplicedThing id
HsSplicedPat (Pat (GhcPass 'Renamed) -> Pat (GhcPass 'Renamed))
-> CpsRn (Pat (GhcPass 'Renamed)) -> CpsRn (Pat (GhcPass 'Renamed))
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
Instance of class: Functor of the constraint type Functor CpsRn
<$> NameMaker -> Pat GhcPs -> CpsRn (Pat (GhcPass 'Renamed))
rnPatAndThen NameMaker
mk Pat GhcPs
pat
rnPatAndThen NameMaker
mk (SplicePat XSplicePat GhcPs
_ HsSplice GhcPs
splice)
= do { Either (Pat GhcPs) (Pat (GhcPass 'Renamed))
eith <- RnM (Either (Pat GhcPs) (Pat (GhcPass 'Renamed)), FreeVars)
-> CpsRn (Either (Pat GhcPs) (Pat (GhcPass 'Renamed)))
forall a. RnM (a, FreeVars) -> CpsRn a
liftCpsFV (RnM (Either (Pat GhcPs) (Pat (GhcPass 'Renamed)), FreeVars)
-> CpsRn (Either (Pat GhcPs) (Pat (GhcPass 'Renamed))))
-> RnM (Either (Pat GhcPs) (Pat (GhcPass 'Renamed)), FreeVars)
-> CpsRn (Either (Pat GhcPs) (Pat (GhcPass 'Renamed)))
forall a b. (a -> b) -> a -> b
$ HsSplice GhcPs
-> RnM (Either (Pat GhcPs) (Pat (GhcPass 'Renamed)), FreeVars)
rnSplicePat HsSplice GhcPs
splice
; case Either (Pat GhcPs) (Pat (GhcPass 'Renamed))
eith of
Left Pat GhcPs
not_yet_renamed -> NameMaker -> Pat GhcPs -> CpsRn (Pat (GhcPass 'Renamed))
rnPatAndThen NameMaker
mk Pat GhcPs
not_yet_renamed
Right Pat (GhcPass 'Renamed)
already_renamed -> Pat (GhcPass 'Renamed) -> CpsRn (Pat (GhcPass 'Renamed))
forall (m :: * -> *) a. Monad m => a -> m a
Instance of class: Monad of the constraint type Monad CpsRn
return Pat (GhcPass 'Renamed)
already_renamed }
rnConPatAndThen :: NameMaker
-> Located RdrName
-> HsConPatDetails GhcPs
-> CpsRn (Pat GhcRn)
rnConPatAndThen :: NameMaker
-> Located RdrName
-> HsConPatDetails GhcPs
-> CpsRn (Pat (GhcPass 'Renamed))
rnConPatAndThen NameMaker
mk Located RdrName
con (PrefixCon [LPat GhcPs]
pats)
= do { Located Name
con' <- Located RdrName -> CpsRn (Located Name)
lookupConCps Located RdrName
con
; [Located (Pat (GhcPass 'Renamed))]
pats' <- NameMaker -> [LPat GhcPs] -> CpsRn [LPat (GhcPass 'Renamed)]
rnLPatsAndThen NameMaker
mk [LPat GhcPs]
pats
; Pat (GhcPass 'Renamed) -> CpsRn (Pat (GhcPass 'Renamed))
forall (m :: * -> *) a. Monad m => a -> m a
Instance of class: Monad of the constraint type Monad CpsRn
return (Pat (GhcPass 'Renamed) -> CpsRn (Pat (GhcPass 'Renamed)))
-> Pat (GhcPass 'Renamed) -> CpsRn (Pat (GhcPass 'Renamed))
forall a b. (a -> b) -> a -> b
$ ConPat :: forall p.
XConPat p -> Located (ConLikeP p) -> HsConPatDetails p -> Pat p
ConPat
{ pat_con_ext :: XConPat (GhcPass 'Renamed)
pat_con_ext = XConPat (GhcPass 'Renamed)
NoExtField
noExtField
, pat_con :: Located (ConLikeP (GhcPass 'Renamed))
pat_con = Located Name
Located (ConLikeP (GhcPass 'Renamed))
con'
, pat_args :: HsConPatDetails (GhcPass 'Renamed)
pat_args = [Located (Pat (GhcPass 'Renamed))]
-> HsConDetails
(Located (Pat (GhcPass 'Renamed)))
(HsRecFields (GhcPass 'Renamed) (Located (Pat (GhcPass 'Renamed))))
forall arg rec. [arg] -> HsConDetails arg rec
PrefixCon [Located (Pat (GhcPass 'Renamed))]
pats'
}
}
rnConPatAndThen NameMaker
mk Located RdrName
con (InfixCon LPat GhcPs
pat1 LPat GhcPs
pat2)
= do { Located Name
con' <- Located RdrName -> CpsRn (Located Name)
lookupConCps Located RdrName
con
; Located (Pat (GhcPass 'Renamed))
pat1' <- NameMaker -> LPat GhcPs -> CpsRn (LPat (GhcPass 'Renamed))
rnLPatAndThen NameMaker
mk LPat GhcPs
pat1
; Located (Pat (GhcPass 'Renamed))
pat2' <- NameMaker -> LPat GhcPs -> CpsRn (LPat (GhcPass 'Renamed))
rnLPatAndThen NameMaker
mk LPat GhcPs
pat2
; Fixity
fixity <- RnM Fixity -> CpsRn Fixity
forall a. RnM a -> CpsRn a
liftCps (RnM Fixity -> CpsRn Fixity) -> RnM Fixity -> CpsRn Fixity
forall a b. (a -> b) -> a -> b
$ Name -> RnM Fixity
lookupFixityRn (Located Name -> Name
forall l e. GenLocated l e -> e
unLoc Located Name
con')
; RnM (Pat (GhcPass 'Renamed)) -> CpsRn (Pat (GhcPass 'Renamed))
forall a. RnM a -> CpsRn a
liftCps (RnM (Pat (GhcPass 'Renamed)) -> CpsRn (Pat (GhcPass 'Renamed)))
-> RnM (Pat (GhcPass 'Renamed)) -> CpsRn (Pat (GhcPass 'Renamed))
forall a b. (a -> b) -> a -> b
$ Located Name
-> Fixity
-> LPat (GhcPass 'Renamed)
-> LPat (GhcPass 'Renamed)
-> RnM (Pat (GhcPass 'Renamed))
mkConOpPatRn Located Name
con' Fixity
fixity Located (Pat (GhcPass 'Renamed))
LPat (GhcPass 'Renamed)
pat1' Located (Pat (GhcPass 'Renamed))
LPat (GhcPass 'Renamed)
pat2' }
rnConPatAndThen NameMaker
mk Located RdrName
con (RecCon HsRecFields GhcPs (LPat GhcPs)
rpats)
= do { Located Name
con' <- Located RdrName -> CpsRn (Located Name)
lookupConCps Located RdrName
con
; HsRecFields (GhcPass 'Renamed) (Located (Pat (GhcPass 'Renamed)))
rpats' <- NameMaker
-> Located Name
-> HsRecFields GhcPs (LPat GhcPs)
-> CpsRn (HsRecFields (GhcPass 'Renamed) (LPat (GhcPass 'Renamed)))
rnHsRecPatsAndThen NameMaker
mk Located Name
con' HsRecFields GhcPs (LPat GhcPs)
rpats
; Pat (GhcPass 'Renamed) -> CpsRn (Pat (GhcPass 'Renamed))
forall (m :: * -> *) a. Monad m => a -> m a
Instance of class: Monad of the constraint type Monad CpsRn
return (Pat (GhcPass 'Renamed) -> CpsRn (Pat (GhcPass 'Renamed)))
-> Pat (GhcPass 'Renamed) -> CpsRn (Pat (GhcPass 'Renamed))
forall a b. (a -> b) -> a -> b
$ ConPat :: forall p.
XConPat p -> Located (ConLikeP p) -> HsConPatDetails p -> Pat p
ConPat
{ pat_con_ext :: XConPat (GhcPass 'Renamed)
pat_con_ext = XConPat (GhcPass 'Renamed)
NoExtField
noExtField
, pat_con :: Located (ConLikeP (GhcPass 'Renamed))
pat_con = Located Name
Located (ConLikeP (GhcPass 'Renamed))
con'
, pat_args :: HsConPatDetails (GhcPass 'Renamed)
pat_args = HsRecFields (GhcPass 'Renamed) (Located (Pat (GhcPass 'Renamed)))
-> HsConDetails
(Located (Pat (GhcPass 'Renamed)))
(HsRecFields (GhcPass 'Renamed) (Located (Pat (GhcPass 'Renamed))))
forall arg rec. rec -> HsConDetails arg rec
RecCon HsRecFields (GhcPass 'Renamed) (Located (Pat (GhcPass 'Renamed)))
rpats'
}
}
checkUnusedRecordWildcardCps :: SrcSpan -> Maybe [Name] -> CpsRn ()
checkUnusedRecordWildcardCps :: SrcSpan -> Maybe [Name] -> CpsRn ()
checkUnusedRecordWildcardCps SrcSpan
loc Maybe [Name]
dotdot_names =
(forall r. (() -> RnM (r, FreeVars)) -> RnM (r, FreeVars))
-> CpsRn ()
forall b.
(forall r. (b -> RnM (r, FreeVars)) -> RnM (r, FreeVars))
-> CpsRn b
CpsRn (\() -> RnM (r, FreeVars)
thing -> do
(r
r, FreeVars
fvs) <- () -> RnM (r, FreeVars)
thing ()
SrcSpan
-> FreeVars -> Maybe [Name] -> IOEnv (Env TcGblEnv TcLclEnv) ()
checkUnusedRecordWildcard SrcSpan
loc FreeVars
fvs Maybe [Name]
dotdot_names
(r, FreeVars) -> RnM (r, FreeVars)
forall (m :: * -> *) a. Monad m => a -> m a
External instance of the constraint type forall m. Monad (IOEnv m)
return (r
r, FreeVars
fvs) )
rnHsRecPatsAndThen :: NameMaker
-> Located Name
-> HsRecFields GhcPs (LPat GhcPs)
-> CpsRn (HsRecFields GhcRn (LPat GhcRn))
rnHsRecPatsAndThen :: NameMaker
-> Located Name
-> HsRecFields GhcPs (LPat GhcPs)
-> CpsRn (HsRecFields (GhcPass 'Renamed) (LPat (GhcPass 'Renamed)))
rnHsRecPatsAndThen NameMaker
mk (L SrcSpan
_ Name
con)
hs_rec_fields :: HsRecFields GhcPs (LPat GhcPs)
hs_rec_fields@(HsRecFields { rec_dotdot :: forall p arg. HsRecFields p arg -> Maybe (Located Int)
rec_dotdot = Maybe (Located Int)
dd })
= do { [LHsRecField (GhcPass 'Renamed) (Located (Pat GhcPs))]
flds <- RnM
([LHsRecField (GhcPass 'Renamed) (Located (Pat GhcPs))], FreeVars)
-> CpsRn [LHsRecField (GhcPass 'Renamed) (Located (Pat GhcPs))]
forall a. RnM (a, FreeVars) -> CpsRn a
liftCpsFV (RnM
([LHsRecField (GhcPass 'Renamed) (Located (Pat GhcPs))], FreeVars)
-> CpsRn [LHsRecField (GhcPass 'Renamed) (Located (Pat GhcPs))])
-> RnM
([LHsRecField (GhcPass 'Renamed) (Located (Pat GhcPs))], FreeVars)
-> CpsRn [LHsRecField (GhcPass 'Renamed) (Located (Pat GhcPs))]
forall a b. (a -> b) -> a -> b
$ HsRecFieldContext
-> (SrcSpan -> RdrName -> Pat GhcPs)
-> HsRecFields GhcPs (Located (Pat GhcPs))
-> RnM
([LHsRecField (GhcPass 'Renamed) (Located (Pat GhcPs))], FreeVars)
forall arg.
HsRecFieldContext
-> (SrcSpan -> RdrName -> arg)
-> HsRecFields GhcPs (Located arg)
-> RnM ([LHsRecField (GhcPass 'Renamed) (Located arg)], FreeVars)
rnHsRecFields (Name -> HsRecFieldContext
HsRecFieldPat Name
con) SrcSpan -> RdrName -> Pat GhcPs
forall {p}. (XVarPat p ~ NoExtField) => SrcSpan -> IdP p -> Pat p
mkVarPat
HsRecFields GhcPs (Located (Pat GhcPs))
HsRecFields GhcPs (LPat GhcPs)
hs_rec_fields
; [GenLocated
SrcSpan
(HsRecField'
(FieldOcc (GhcPass 'Renamed)) (Located (Pat (GhcPass 'Renamed))))]
flds' <- ((LHsRecField (GhcPass 'Renamed) (Located (Pat GhcPs)), Int)
-> CpsRn
(GenLocated
SrcSpan
(HsRecField'
(FieldOcc (GhcPass 'Renamed)) (Located (Pat (GhcPass 'Renamed))))))
-> [(LHsRecField (GhcPass 'Renamed) (Located (Pat GhcPs)), Int)]
-> CpsRn
[GenLocated
SrcSpan
(HsRecField'
(FieldOcc (GhcPass 'Renamed)) (Located (Pat (GhcPass 'Renamed))))]
forall (t :: * -> *) (m :: * -> *) a b.
(Traversable t, Monad m) =>
(a -> m b) -> t a -> m (t b)
Instance of class: Monad of the constraint type Monad CpsRn
External instance of the constraint type Traversable []
mapM (LHsRecField (GhcPass 'Renamed) (Located (Pat GhcPs)), Int)
-> CpsRn
(GenLocated
SrcSpan
(HsRecField'
(FieldOcc (GhcPass 'Renamed)) (Located (Pat (GhcPass 'Renamed)))))
rn_field ([LHsRecField (GhcPass 'Renamed) (Located (Pat GhcPs))]
flds [LHsRecField (GhcPass 'Renamed) (Located (Pat GhcPs))]
-> [Int]
-> [(LHsRecField (GhcPass 'Renamed) (Located (Pat GhcPs)), Int)]
forall a b. [a] -> [b] -> [(a, b)]
`zip` [Int
1..])
; Maybe [Name] -> CpsRn ()
check_unused_wildcard ([GenLocated
SrcSpan
(HsRecField'
(FieldOcc (GhcPass 'Renamed)) (LPat (GhcPass 'Renamed)))]
-> Located Int -> [IdP (GhcPass 'Renamed)]
forall {p} {l} {id} {l}.
CollectPass p =>
[GenLocated l (HsRecField' id (XRec p Pat))]
-> GenLocated l Int -> [IdP p]
External instance of the constraint type CollectPass (GhcPass 'Renamed)
implicit_binders [GenLocated
SrcSpan
(HsRecField'
(FieldOcc (GhcPass 'Renamed)) (Located (Pat (GhcPass 'Renamed))))]
[GenLocated
SrcSpan
(HsRecField'
(FieldOcc (GhcPass 'Renamed)) (LPat (GhcPass 'Renamed)))]
flds' (Located Int -> [Name]) -> Maybe (Located Int) -> Maybe [Name]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
External instance of the constraint type Functor Maybe
<$> Maybe (Located Int)
dd)
; HsRecFields (GhcPass 'Renamed) (Located (Pat (GhcPass 'Renamed)))
-> CpsRn
(HsRecFields (GhcPass 'Renamed) (Located (Pat (GhcPass 'Renamed))))
forall (m :: * -> *) a. Monad m => a -> m a
Instance of class: Monad of the constraint type Monad CpsRn
return (HsRecFields :: forall p arg.
[LHsRecField p arg] -> Maybe (Located Int) -> HsRecFields p arg
HsRecFields { rec_flds :: [GenLocated
SrcSpan
(HsRecField'
(FieldOcc (GhcPass 'Renamed)) (Located (Pat (GhcPass 'Renamed))))]
rec_flds = [GenLocated
SrcSpan
(HsRecField'
(FieldOcc (GhcPass 'Renamed)) (Located (Pat (GhcPass 'Renamed))))]
flds', rec_dotdot :: Maybe (Located Int)
rec_dotdot = Maybe (Located Int)
dd }) }
where
mkVarPat :: SrcSpan -> IdP p -> Pat p
mkVarPat SrcSpan
l IdP p
n = XVarPat p -> Located (IdP p) -> Pat p
forall p. XVarPat p -> Located (IdP p) -> Pat p
VarPat XVarPat p
NoExtField
noExtField (SrcSpan -> IdP p -> Located (IdP p)
forall l e. l -> e -> GenLocated l e
L SrcSpan
l IdP p
n)
rn_field :: (LHsRecField (GhcPass 'Renamed) (Located (Pat GhcPs)), Int)
-> CpsRn
(GenLocated
SrcSpan
(HsRecField'
(FieldOcc (GhcPass 'Renamed)) (Located (Pat (GhcPass 'Renamed)))))
rn_field (L SrcSpan
l HsRecField' (FieldOcc (GhcPass 'Renamed)) (Located (Pat GhcPs))
fld, Int
n') =
do { Located (Pat (GhcPass 'Renamed))
arg' <- NameMaker -> LPat GhcPs -> CpsRn (LPat (GhcPass 'Renamed))
rnLPatAndThen (Maybe (Located Int) -> NameMaker -> Int -> NameMaker
forall {a} {l}.
Ord a =>
Maybe (GenLocated l a) -> NameMaker -> a -> NameMaker
External instance of the constraint type Ord Int
nested_mk Maybe (Located Int)
dd NameMaker
mk Int
n') (HsRecField' (FieldOcc (GhcPass 'Renamed)) (Located (Pat GhcPs))
-> Located (Pat GhcPs)
forall id arg. HsRecField' id arg -> arg
hsRecFieldArg HsRecField' (FieldOcc (GhcPass 'Renamed)) (Located (Pat GhcPs))
fld)
; GenLocated
SrcSpan
(HsRecField'
(FieldOcc (GhcPass 'Renamed)) (Located (Pat (GhcPass 'Renamed))))
-> CpsRn
(GenLocated
SrcSpan
(HsRecField'
(FieldOcc (GhcPass 'Renamed)) (Located (Pat (GhcPass 'Renamed)))))
forall (m :: * -> *) a. Monad m => a -> m a
Instance of class: Monad of the constraint type Monad CpsRn
return (SrcSpan
-> HsRecField'
(FieldOcc (GhcPass 'Renamed)) (Located (Pat (GhcPass 'Renamed)))
-> GenLocated
SrcSpan
(HsRecField'
(FieldOcc (GhcPass 'Renamed)) (Located (Pat (GhcPass 'Renamed))))
forall l e. l -> e -> GenLocated l e
L SrcSpan
l (HsRecField' (FieldOcc (GhcPass 'Renamed)) (Located (Pat GhcPs))
fld { hsRecFieldArg :: Located (Pat (GhcPass 'Renamed))
hsRecFieldArg = Located (Pat (GhcPass 'Renamed))
arg' })) }
loc :: SrcSpan
loc = SrcSpan
-> (Located Int -> SrcSpan) -> Maybe (Located Int) -> SrcSpan
forall b a. b -> (a -> b) -> Maybe a -> b
maybe SrcSpan
noSrcSpan Located Int -> SrcSpan
forall l e. GenLocated l e -> l
getLoc Maybe (Located Int)
dd
implicit_binders :: [GenLocated l (HsRecField' id (XRec p Pat))]
-> GenLocated l Int -> [IdP p]
implicit_binders [GenLocated l (HsRecField' id (XRec p Pat))]
fs (GenLocated l Int -> Int
forall l e. GenLocated l e -> e
unLoc -> Int
n) = [XRec p Pat] -> [IdP p]
forall p. CollectPass p => [LPat p] -> [IdP p]
Evidence bound by a type signature of the constraint type CollectPass p
collectPatsBinders [XRec p Pat]
implicit_pats
where
implicit_pats :: [XRec p Pat]
implicit_pats = (GenLocated l (HsRecField' id (XRec p Pat)) -> XRec p Pat)
-> [GenLocated l (HsRecField' id (XRec p Pat))] -> [XRec p Pat]
forall a b. (a -> b) -> [a] -> [b]
map (HsRecField' id (XRec p Pat) -> XRec p Pat
forall id arg. HsRecField' id arg -> arg
hsRecFieldArg (HsRecField' id (XRec p Pat) -> XRec p Pat)
-> (GenLocated l (HsRecField' id (XRec p Pat))
-> HsRecField' id (XRec p Pat))
-> GenLocated l (HsRecField' id (XRec p Pat))
-> XRec p Pat
forall b c a. (b -> c) -> (a -> b) -> a -> c
. GenLocated l (HsRecField' id (XRec p Pat))
-> HsRecField' id (XRec p Pat)
forall l e. GenLocated l e -> e
unLoc) (Int
-> [GenLocated l (HsRecField' id (XRec p Pat))]
-> [GenLocated l (HsRecField' id (XRec p Pat))]
forall a. Int -> [a] -> [a]
drop Int
n [GenLocated l (HsRecField' id (XRec p Pat))]
fs)
check_unused_wildcard :: Maybe [Name] -> CpsRn ()
check_unused_wildcard = case NameMaker
mk of
LetMk{} -> CpsRn () -> Maybe [Name] -> CpsRn ()
forall a b. a -> b -> a
const (() -> CpsRn ()
forall (m :: * -> *) a. Monad m => a -> m a
Instance of class: Monad of the constraint type Monad CpsRn
return ())
LamMk{} -> SrcSpan -> Maybe [Name] -> CpsRn ()
checkUnusedRecordWildcardCps SrcSpan
loc
nested_mk :: Maybe (GenLocated l a) -> NameMaker -> a -> NameMaker
nested_mk Maybe (GenLocated l a)
Nothing NameMaker
mk a
_ = NameMaker
mk
nested_mk (Just GenLocated l a
_) mk :: NameMaker
mk@(LetMk {}) a
_ = NameMaker
mk
nested_mk (Just (GenLocated l a -> a
forall l e. GenLocated l e -> e
unLoc -> a
n)) (LamMk Bool
report_unused) a
n'
= Bool -> NameMaker
LamMk (Bool
report_unused Bool -> Bool -> Bool
&& (a
n' a -> a -> Bool
forall a. Ord a => a -> a -> Bool
Evidence bound by a type signature of the constraint type Ord a
<= a
n))
data HsRecFieldContext
= HsRecFieldCon Name
| HsRecFieldPat Name
| HsRecFieldUpd
rnHsRecFields
:: forall arg.
HsRecFieldContext
-> (SrcSpan -> RdrName -> arg)
-> HsRecFields GhcPs (Located arg)
-> RnM ([LHsRecField GhcRn (Located arg)], FreeVars)
rnHsRecFields :: HsRecFieldContext
-> (SrcSpan -> RdrName -> arg)
-> HsRecFields GhcPs (Located arg)
-> RnM ([LHsRecField (GhcPass 'Renamed) (Located arg)], FreeVars)
rnHsRecFields HsRecFieldContext
ctxt SrcSpan -> RdrName -> arg
mk_arg (HsRecFields { rec_flds :: forall p arg. HsRecFields p arg -> [LHsRecField p arg]
rec_flds = [LHsRecField GhcPs (Located arg)]
flds, rec_dotdot :: forall p arg. HsRecFields p arg -> Maybe (Located Int)
rec_dotdot = Maybe (Located Int)
dotdot })
= do { Bool
pun_ok <- Extension -> RnM Bool
forall gbl lcl. Extension -> TcRnIf gbl lcl Bool
xoptM Extension
LangExt.RecordPuns
; Bool
disambig_ok <- Extension -> RnM Bool
forall gbl lcl. Extension -> TcRnIf gbl lcl Bool
xoptM Extension
LangExt.DisambiguateRecordFields
; let parent :: Maybe Name
parent = Bool -> Maybe ()
forall (f :: * -> *). Alternative f => Bool -> f ()
External instance of the constraint type Alternative Maybe
guard Bool
disambig_ok Maybe () -> Maybe Name -> Maybe Name
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
External instance of the constraint type Monad Maybe
>> Maybe Name
mb_con
; [LHsRecField (GhcPass 'Renamed) (Located arg)]
flds1 <- (LHsRecField GhcPs (Located arg)
-> IOEnv
(Env TcGblEnv TcLclEnv)
(LHsRecField (GhcPass 'Renamed) (Located arg)))
-> [LHsRecField GhcPs (Located arg)]
-> IOEnv
(Env TcGblEnv TcLclEnv)
[LHsRecField (GhcPass 'Renamed) (Located arg)]
forall (t :: * -> *) (m :: * -> *) a b.
(Traversable t, Monad m) =>
(a -> m b) -> t a -> m (t b)
External instance of the constraint type forall m. Monad (IOEnv m)
External instance of the constraint type Traversable []
mapM (Bool
-> Maybe Name
-> LHsRecField GhcPs (Located arg)
-> IOEnv
(Env TcGblEnv TcLclEnv)
(LHsRecField (GhcPass 'Renamed) (Located arg))
rn_fld Bool
pun_ok Maybe Name
parent) [LHsRecField GhcPs (Located arg)]
flds
; (NonEmpty RdrName -> IOEnv (Env TcGblEnv TcLclEnv) ())
-> [NonEmpty RdrName] -> IOEnv (Env TcGblEnv TcLclEnv) ()
forall (t :: * -> *) (m :: * -> *) a b.
(Foldable t, Monad m) =>
(a -> m b) -> t a -> m ()
External instance of the constraint type forall m. Monad (IOEnv m)
External instance of the constraint type Foldable []
mapM_ (MsgDoc -> IOEnv (Env TcGblEnv TcLclEnv) ()
addErr (MsgDoc -> IOEnv (Env TcGblEnv TcLclEnv) ())
-> (NonEmpty RdrName -> MsgDoc)
-> NonEmpty RdrName
-> IOEnv (Env TcGblEnv TcLclEnv) ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. HsRecFieldContext -> NonEmpty RdrName -> MsgDoc
dupFieldErr HsRecFieldContext
ctxt) [NonEmpty RdrName]
dup_flds
; [LHsRecField (GhcPass 'Renamed) (Located arg)]
dotdot_flds <- Maybe (Located Int)
-> Maybe Name
-> [LHsRecField (GhcPass 'Renamed) (Located arg)]
-> IOEnv
(Env TcGblEnv TcLclEnv)
[LHsRecField (GhcPass 'Renamed) (Located arg)]
rn_dotdot Maybe (Located Int)
dotdot Maybe Name
mb_con [LHsRecField (GhcPass 'Renamed) (Located arg)]
flds1
; let all_flds :: [LHsRecField (GhcPass 'Renamed) (Located arg)]
all_flds | [LHsRecField (GhcPass 'Renamed) (Located arg)] -> Bool
forall (t :: * -> *) a. Foldable t => t a -> Bool
External instance of the constraint type Foldable []
null [LHsRecField (GhcPass 'Renamed) (Located arg)]
dotdot_flds = [LHsRecField (GhcPass 'Renamed) (Located arg)]
flds1
| Bool
otherwise = [LHsRecField (GhcPass 'Renamed) (Located arg)]
flds1 [LHsRecField (GhcPass 'Renamed) (Located arg)]
-> [LHsRecField (GhcPass 'Renamed) (Located arg)]
-> [LHsRecField (GhcPass 'Renamed) (Located arg)]
forall a. [a] -> [a] -> [a]
++ [LHsRecField (GhcPass 'Renamed) (Located arg)]
dotdot_flds
; ([LHsRecField (GhcPass 'Renamed) (Located arg)], FreeVars)
-> RnM ([LHsRecField (GhcPass 'Renamed) (Located arg)], FreeVars)
forall (m :: * -> *) a. Monad m => a -> m a
External instance of the constraint type forall m. Monad (IOEnv m)
return ([LHsRecField (GhcPass 'Renamed) (Located arg)]
all_flds, [Name] -> FreeVars
mkFVs ([LHsRecField (GhcPass 'Renamed) (Located arg)] -> [Name]
forall arg. [LHsRecField (GhcPass 'Renamed) arg] -> [Name]
getFieldIds [LHsRecField (GhcPass 'Renamed) (Located arg)]
all_flds)) }
where
mb_con :: Maybe Name
mb_con = case HsRecFieldContext
ctxt of
HsRecFieldCon Name
con -> Name -> Maybe Name
forall a. a -> Maybe a
Just Name
con
HsRecFieldPat Name
con -> Name -> Maybe Name
forall a. a -> Maybe a
Just Name
con
HsRecFieldContext
_ -> Maybe Name
forall a. Maybe a
Nothing
rn_fld :: Bool -> Maybe Name -> LHsRecField GhcPs (Located arg)
-> RnM (LHsRecField GhcRn (Located arg))
rn_fld :: Bool
-> Maybe Name
-> LHsRecField GhcPs (Located arg)
-> IOEnv
(Env TcGblEnv TcLclEnv)
(LHsRecField (GhcPass 'Renamed) (Located arg))
rn_fld Bool
pun_ok Maybe Name
parent (L SrcSpan
l
(HsRecField
{ hsRecFieldLbl :: forall id arg. HsRecField' id arg -> Located id
hsRecFieldLbl =
(L SrcSpan
loc (FieldOcc XCFieldOcc GhcPs
_ (L SrcSpan
ll RdrName
lbl)))
, hsRecFieldArg :: forall id arg. HsRecField' id arg -> arg
hsRecFieldArg = Located arg
arg
, hsRecPun :: forall id arg. HsRecField' id arg -> Bool
hsRecPun = Bool
pun }))
= do { Name
sel <- SrcSpan -> RnM Name -> RnM Name
forall a. SrcSpan -> TcRn a -> TcRn a
setSrcSpan SrcSpan
loc (RnM Name -> RnM Name) -> RnM Name -> RnM Name
forall a b. (a -> b) -> a -> b
$ Maybe Name -> RdrName -> RnM Name
lookupRecFieldOcc Maybe Name
parent RdrName
lbl
; Located arg
arg' <- if Bool
pun
then do { Bool -> MsgDoc -> IOEnv (Env TcGblEnv TcLclEnv) ()
checkErr Bool
pun_ok (Located RdrName -> MsgDoc
badPun (SrcSpan -> RdrName -> Located RdrName
forall l e. l -> e -> GenLocated l e
L SrcSpan
loc RdrName
lbl))
; let arg_rdr :: RdrName
arg_rdr = OccName -> RdrName
mkRdrUnqual (RdrName -> OccName
rdrNameOcc RdrName
lbl)
; Located arg -> IOEnv (Env TcGblEnv TcLclEnv) (Located arg)
forall (m :: * -> *) a. Monad m => a -> m a
External instance of the constraint type forall m. Monad (IOEnv m)
return (SrcSpan -> arg -> Located arg
forall l e. l -> e -> GenLocated l e
L SrcSpan
loc (SrcSpan -> RdrName -> arg
mk_arg SrcSpan
loc RdrName
arg_rdr)) }
else Located arg -> IOEnv (Env TcGblEnv TcLclEnv) (Located arg)
forall (m :: * -> *) a. Monad m => a -> m a
External instance of the constraint type forall m. Monad (IOEnv m)
return Located arg
arg
; LHsRecField (GhcPass 'Renamed) (Located arg)
-> IOEnv
(Env TcGblEnv TcLclEnv)
(LHsRecField (GhcPass 'Renamed) (Located arg))
forall (m :: * -> *) a. Monad m => a -> m a
External instance of the constraint type forall m. Monad (IOEnv m)
return (SrcSpan
-> HsRecField' (FieldOcc (GhcPass 'Renamed)) (Located arg)
-> LHsRecField (GhcPass 'Renamed) (Located arg)
forall l e. l -> e -> GenLocated l e
L SrcSpan
l (HsRecField :: forall id arg. Located id -> arg -> Bool -> HsRecField' id arg
HsRecField
{ hsRecFieldLbl :: Located (FieldOcc (GhcPass 'Renamed))
hsRecFieldLbl = (SrcSpan
-> FieldOcc (GhcPass 'Renamed)
-> Located (FieldOcc (GhcPass 'Renamed))
forall l e. l -> e -> GenLocated l e
L SrcSpan
loc (XCFieldOcc (GhcPass 'Renamed)
-> Located RdrName -> FieldOcc (GhcPass 'Renamed)
forall pass. XCFieldOcc pass -> Located RdrName -> FieldOcc pass
FieldOcc
Name
XCFieldOcc (GhcPass 'Renamed)
sel (SrcSpan -> RdrName -> Located RdrName
forall l e. l -> e -> GenLocated l e
L SrcSpan
ll RdrName
lbl)))
, hsRecFieldArg :: Located arg
hsRecFieldArg = Located arg
arg'
, hsRecPun :: Bool
hsRecPun = Bool
pun })) }
rn_dotdot :: Maybe (Located Int)
-> Maybe Name
-> [LHsRecField GhcRn (Located arg)]
-> RnM ([LHsRecField GhcRn (Located arg)])
rn_dotdot :: Maybe (Located Int)
-> Maybe Name
-> [LHsRecField (GhcPass 'Renamed) (Located arg)]
-> IOEnv
(Env TcGblEnv TcLclEnv)
[LHsRecField (GhcPass 'Renamed) (Located arg)]
rn_dotdot (Just (L SrcSpan
loc Int
n)) (Just Name
con) [LHsRecField (GhcPass 'Renamed) (Located arg)]
flds
| Bool -> Bool
not (Name -> Bool
isUnboundName Name
con)
= ASSERT( flds `lengthIs` n )
do { Bool
dd_flag <- Extension -> RnM Bool
forall gbl lcl. Extension -> TcRnIf gbl lcl Bool
xoptM Extension
LangExt.RecordWildCards
; Bool -> MsgDoc -> IOEnv (Env TcGblEnv TcLclEnv) ()
checkErr Bool
dd_flag (HsRecFieldContext -> MsgDoc
needFlagDotDot HsRecFieldContext
ctxt)
; (GlobalRdrEnv
rdr_env, LocalRdrEnv
lcl_env) <- TcRn (GlobalRdrEnv, LocalRdrEnv)
getRdrEnvs
; [FieldLabel]
con_fields <- Name -> RnM [FieldLabel]
lookupConstructorFields Name
con
; Bool
-> IOEnv (Env TcGblEnv TcLclEnv) ()
-> IOEnv (Env TcGblEnv TcLclEnv) ()
forall (f :: * -> *). Applicative f => Bool -> f () -> f ()
External instance of the constraint type forall m. Applicative (IOEnv m)
when ([FieldLabel] -> Bool
forall (t :: * -> *) a. Foldable t => t a -> Bool
External instance of the constraint type Foldable []
null [FieldLabel]
con_fields) (MsgDoc -> IOEnv (Env TcGblEnv TcLclEnv) ()
addErr (Name -> MsgDoc
badDotDotCon Name
con))
; let present_flds :: OccSet
present_flds = [OccName] -> OccSet
mkOccSet ([OccName] -> OccSet) -> [OccName] -> OccSet
forall a b. (a -> b) -> a -> b
$ (RdrName -> OccName) -> [RdrName] -> [OccName]
forall a b. (a -> b) -> [a] -> [b]
map RdrName -> OccName
rdrNameOcc ([LHsRecField (GhcPass 'Renamed) (Located arg)] -> [RdrName]
forall id arg. [LHsRecField id arg] -> [RdrName]
getFieldLbls [LHsRecField (GhcPass 'Renamed) (Located arg)]
flds)
arg_in_scope :: OccName -> Bool
arg_in_scope OccName
lbl = OccName -> RdrName
mkRdrUnqual OccName
lbl RdrName -> LocalRdrEnv -> Bool
`elemLocalRdrEnv` LocalRdrEnv
lcl_env
([FieldLabel]
dot_dot_fields, [GlobalRdrElt]
dot_dot_gres)
= [(FieldLabel, GlobalRdrElt)] -> ([FieldLabel], [GlobalRdrElt])
forall a b. [(a, b)] -> ([a], [b])
unzip [ (FieldLabel
fl, GlobalRdrElt
gre)
| FieldLabel
fl <- [FieldLabel]
con_fields
, let lbl :: OccName
lbl = FastString -> OccName
mkVarOccFS (FieldLabel -> FastString
forall a. FieldLbl a -> FastString
flLabel FieldLabel
fl)
, Bool -> Bool
not (OccName
lbl OccName -> OccSet -> Bool
`elemOccSet` OccSet
present_flds)
, Just GlobalRdrElt
gre <- [GlobalRdrEnv -> FieldLabel -> Maybe GlobalRdrElt
lookupGRE_FieldLabel GlobalRdrEnv
rdr_env FieldLabel
fl]
, case HsRecFieldContext
ctxt of
HsRecFieldCon {} -> OccName -> Bool
arg_in_scope OccName
lbl
HsRecFieldContext
_other -> Bool
True ]
; [GlobalRdrElt] -> IOEnv (Env TcGblEnv TcLclEnv) ()
addUsedGREs [GlobalRdrElt]
dot_dot_gres
; [LHsRecField (GhcPass 'Renamed) (Located arg)]
-> IOEnv
(Env TcGblEnv TcLclEnv)
[LHsRecField (GhcPass 'Renamed) (Located arg)]
forall (m :: * -> *) a. Monad m => a -> m a
External instance of the constraint type forall m. Monad (IOEnv m)
return [ SrcSpan
-> HsRecField' (FieldOcc (GhcPass 'Renamed)) (Located arg)
-> LHsRecField (GhcPass 'Renamed) (Located arg)
forall l e. l -> e -> GenLocated l e
L SrcSpan
loc (HsRecField :: forall id arg. Located id -> arg -> Bool -> HsRecField' id arg
HsRecField
{ hsRecFieldLbl :: Located (FieldOcc (GhcPass 'Renamed))
hsRecFieldLbl = SrcSpan
-> FieldOcc (GhcPass 'Renamed)
-> Located (FieldOcc (GhcPass 'Renamed))
forall l e. l -> e -> GenLocated l e
L SrcSpan
loc (XCFieldOcc (GhcPass 'Renamed)
-> Located RdrName -> FieldOcc (GhcPass 'Renamed)
forall pass. XCFieldOcc pass -> Located RdrName -> FieldOcc pass
FieldOcc Name
XCFieldOcc (GhcPass 'Renamed)
sel (SrcSpan -> RdrName -> Located RdrName
forall l e. l -> e -> GenLocated l e
L SrcSpan
loc RdrName
arg_rdr))
, hsRecFieldArg :: Located arg
hsRecFieldArg = SrcSpan -> arg -> Located arg
forall l e. l -> e -> GenLocated l e
L SrcSpan
loc (SrcSpan -> RdrName -> arg
mk_arg SrcSpan
loc RdrName
arg_rdr)
, hsRecPun :: Bool
hsRecPun = Bool
False })
| FieldLabel
fl <- [FieldLabel]
dot_dot_fields
, let sel :: Name
sel = FieldLabel -> Name
forall a. FieldLbl a -> a
flSelector FieldLabel
fl
, let arg_rdr :: RdrName
arg_rdr = FastString -> RdrName
mkVarUnqual (FieldLabel -> FastString
forall a. FieldLbl a -> FastString
flLabel FieldLabel
fl) ] }
rn_dotdot Maybe (Located Int)
_dotdot Maybe Name
_mb_con [LHsRecField (GhcPass 'Renamed) (Located arg)]
_flds
= [LHsRecField (GhcPass 'Renamed) (Located arg)]
-> IOEnv
(Env TcGblEnv TcLclEnv)
[LHsRecField (GhcPass 'Renamed) (Located arg)]
forall (m :: * -> *) a. Monad m => a -> m a
External instance of the constraint type forall m. Monad (IOEnv m)
return []
dup_flds :: [NE.NonEmpty RdrName]
([RdrName]
_, [NonEmpty RdrName]
dup_flds) = (RdrName -> RdrName -> Ordering)
-> [RdrName] -> ([RdrName], [NonEmpty RdrName])
forall a. (a -> a -> Ordering) -> [a] -> ([a], [NonEmpty a])
removeDups RdrName -> RdrName -> Ordering
forall a. Ord a => a -> a -> Ordering
External instance of the constraint type Ord RdrName
compare ([LHsRecField GhcPs (Located arg)] -> [RdrName]
forall id arg. [LHsRecField id arg] -> [RdrName]
getFieldLbls [LHsRecField GhcPs (Located arg)]
flds)
rnHsRecUpdFields
:: [LHsRecUpdField GhcPs]
-> RnM ([LHsRecUpdField GhcRn], FreeVars)
rnHsRecUpdFields :: [LHsRecUpdField GhcPs]
-> RnM ([LHsRecUpdField (GhcPass 'Renamed)], FreeVars)
rnHsRecUpdFields [LHsRecUpdField GhcPs]
flds
= do { Bool
pun_ok <- Extension -> RnM Bool
forall gbl lcl. Extension -> TcRnIf gbl lcl Bool
xoptM Extension
LangExt.RecordPuns
; Bool
overload_ok <- Extension -> RnM Bool
forall gbl lcl. Extension -> TcRnIf gbl lcl Bool
xoptM Extension
LangExt.DuplicateRecordFields
; ([LHsRecUpdField (GhcPass 'Renamed)]
flds1, [FreeVars]
fvss) <- (LHsRecUpdField GhcPs
-> IOEnv
(Env TcGblEnv TcLclEnv)
(LHsRecUpdField (GhcPass 'Renamed), FreeVars))
-> [LHsRecUpdField GhcPs]
-> IOEnv
(Env TcGblEnv TcLclEnv)
([LHsRecUpdField (GhcPass 'Renamed)], [FreeVars])
forall (m :: * -> *) a b c.
Applicative m =>
(a -> m (b, c)) -> [a] -> m ([b], [c])
External instance of the constraint type forall m. Applicative (IOEnv m)
mapAndUnzipM (Bool
-> Bool
-> LHsRecUpdField GhcPs
-> IOEnv
(Env TcGblEnv TcLclEnv)
(LHsRecUpdField (GhcPass 'Renamed), FreeVars)
rn_fld Bool
pun_ok Bool
overload_ok) [LHsRecUpdField GhcPs]
flds
; (NonEmpty RdrName -> IOEnv (Env TcGblEnv TcLclEnv) ())
-> [NonEmpty RdrName] -> IOEnv (Env TcGblEnv TcLclEnv) ()
forall (t :: * -> *) (m :: * -> *) a b.
(Foldable t, Monad m) =>
(a -> m b) -> t a -> m ()
External instance of the constraint type forall m. Monad (IOEnv m)
External instance of the constraint type Foldable []
mapM_ (MsgDoc -> IOEnv (Env TcGblEnv TcLclEnv) ()
addErr (MsgDoc -> IOEnv (Env TcGblEnv TcLclEnv) ())
-> (NonEmpty RdrName -> MsgDoc)
-> NonEmpty RdrName
-> IOEnv (Env TcGblEnv TcLclEnv) ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. HsRecFieldContext -> NonEmpty RdrName -> MsgDoc
dupFieldErr HsRecFieldContext
HsRecFieldUpd) [NonEmpty RdrName]
dup_flds
; Bool
-> IOEnv (Env TcGblEnv TcLclEnv) ()
-> IOEnv (Env TcGblEnv TcLclEnv) ()
forall (f :: * -> *). Applicative f => Bool -> f () -> f ()
External instance of the constraint type forall m. Applicative (IOEnv m)
when ([LHsRecUpdField GhcPs] -> Bool
forall (t :: * -> *) a. Foldable t => t a -> Bool
External instance of the constraint type Foldable []
null [LHsRecUpdField GhcPs]
flds) (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
emptyUpdateErr
; ([LHsRecUpdField (GhcPass 'Renamed)], FreeVars)
-> RnM ([LHsRecUpdField (GhcPass 'Renamed)], FreeVars)
forall (m :: * -> *) a. Monad m => a -> m a
External instance of the constraint type forall m. Monad (IOEnv m)
return ([LHsRecUpdField (GhcPass 'Renamed)]
flds1, [FreeVars] -> FreeVars
plusFVs [FreeVars]
fvss) }
where
doc :: MsgDoc
doc = String -> MsgDoc
text String
"constructor field name"
rn_fld :: Bool -> Bool -> LHsRecUpdField GhcPs
-> RnM (LHsRecUpdField GhcRn, FreeVars)
rn_fld :: Bool
-> Bool
-> LHsRecUpdField GhcPs
-> IOEnv
(Env TcGblEnv TcLclEnv)
(LHsRecUpdField (GhcPass 'Renamed), FreeVars)
rn_fld Bool
pun_ok Bool
overload_ok (L SrcSpan
l (HsRecField { hsRecFieldLbl :: forall id arg. HsRecField' id arg -> Located id
hsRecFieldLbl = L SrcSpan
loc AmbiguousFieldOcc GhcPs
f
, hsRecFieldArg :: forall id arg. HsRecField' id arg -> arg
hsRecFieldArg = LHsExpr GhcPs
arg
, hsRecPun :: forall id arg. HsRecField' id arg -> Bool
hsRecPun = Bool
pun }))
= do { let lbl :: RdrName
lbl = AmbiguousFieldOcc GhcPs -> RdrName
forall (p :: Pass). AmbiguousFieldOcc (GhcPass p) -> RdrName
rdrNameAmbiguousFieldOcc AmbiguousFieldOcc GhcPs
f
; Either Name [Name]
sel <- SrcSpan -> TcRn (Either Name [Name]) -> TcRn (Either Name [Name])
forall a. SrcSpan -> TcRn a -> TcRn a
setSrcSpan SrcSpan
loc (TcRn (Either Name [Name]) -> TcRn (Either Name [Name]))
-> TcRn (Either Name [Name]) -> TcRn (Either Name [Name])
forall a b. (a -> b) -> a -> b
$
if Bool
overload_ok
then do { Maybe (Either Name [Name])
mb <- Bool -> RdrName -> RnM (Maybe (Either Name [Name]))
lookupGlobalOccRn_overloaded
Bool
overload_ok RdrName
lbl
; case Maybe (Either Name [Name])
mb of
Maybe (Either Name [Name])
Nothing ->
do { MsgDoc -> IOEnv (Env TcGblEnv TcLclEnv) ()
addErr
(MsgDoc -> RdrName -> MsgDoc
unknownSubordinateErr MsgDoc
doc RdrName
lbl)
; Either Name [Name] -> TcRn (Either Name [Name])
forall (m :: * -> *) a. Monad m => a -> m a
External instance of the constraint type forall m. Monad (IOEnv m)
return ([Name] -> Either Name [Name]
forall a b. b -> Either a b
Right []) }
Just Either Name [Name]
r -> Either Name [Name] -> TcRn (Either Name [Name])
forall (m :: * -> *) a. Monad m => a -> m a
External instance of the constraint type forall m. Monad (IOEnv m)
return Either Name [Name]
r }
else (Name -> Either Name [Name])
-> RnM Name -> TcRn (Either Name [Name])
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
External instance of the constraint type forall env. Functor (IOEnv env)
fmap Name -> Either Name [Name]
forall a b. a -> Either a b
Left (RnM Name -> TcRn (Either Name [Name]))
-> RnM Name -> TcRn (Either Name [Name])
forall a b. (a -> b) -> a -> b
$ RdrName -> RnM Name
lookupGlobalOccRn RdrName
lbl
; LHsExpr GhcPs
arg' <- if Bool
pun
then do { Bool -> MsgDoc -> IOEnv (Env TcGblEnv TcLclEnv) ()
checkErr Bool
pun_ok (Located RdrName -> MsgDoc
badPun (SrcSpan -> RdrName -> Located RdrName
forall l e. l -> e -> GenLocated l e
L SrcSpan
loc RdrName
lbl))
; let arg_rdr :: RdrName
arg_rdr = OccName -> RdrName
mkRdrUnqual (RdrName -> OccName
rdrNameOcc RdrName
lbl)
; LHsExpr GhcPs -> IOEnv (Env TcGblEnv TcLclEnv) (LHsExpr GhcPs)
forall (m :: * -> *) a. Monad m => a -> m a
External instance of the constraint type forall m. Monad (IOEnv m)
return (SrcSpan -> HsExpr GhcPs -> LHsExpr GhcPs
forall l e. l -> e -> GenLocated l e
L SrcSpan
loc (XVar GhcPs -> GenLocated SrcSpan (IdP GhcPs) -> HsExpr GhcPs
forall p. XVar p -> Located (IdP p) -> HsExpr p
HsVar XVar GhcPs
NoExtField
noExtField (SrcSpan -> RdrName -> Located RdrName
forall l e. l -> e -> GenLocated l e
L SrcSpan
loc RdrName
arg_rdr))) }
else LHsExpr GhcPs -> IOEnv (Env TcGblEnv TcLclEnv) (LHsExpr GhcPs)
forall (m :: * -> *) a. Monad m => a -> m a
External instance of the constraint type forall m. Monad (IOEnv m)
return LHsExpr GhcPs
arg
; (LHsExpr (GhcPass 'Renamed)
arg'', FreeVars
fvs) <- LHsExpr GhcPs -> RnM (LHsExpr (GhcPass 'Renamed), FreeVars)
rnLExpr LHsExpr GhcPs
arg'
; let fvs' :: FreeVars
fvs' = case Either Name [Name]
sel of
Left Name
sel_name -> FreeVars
fvs FreeVars -> Name -> FreeVars
`addOneFV` Name
sel_name
Right [Name
sel_name] -> FreeVars
fvs FreeVars -> Name -> FreeVars
`addOneFV` Name
sel_name
Right [Name]
_ -> FreeVars
fvs
lbl' :: GenLocated SrcSpan (AmbiguousFieldOcc (GhcPass 'Renamed))
lbl' = case Either Name [Name]
sel of
Left Name
sel_name ->
SrcSpan
-> AmbiguousFieldOcc (GhcPass 'Renamed)
-> GenLocated SrcSpan (AmbiguousFieldOcc (GhcPass 'Renamed))
forall l e. l -> e -> GenLocated l e
L SrcSpan
loc (XUnambiguous (GhcPass 'Renamed)
-> Located RdrName -> AmbiguousFieldOcc (GhcPass 'Renamed)
forall pass.
XUnambiguous pass -> Located RdrName -> AmbiguousFieldOcc pass
Unambiguous Name
XUnambiguous (GhcPass 'Renamed)
sel_name (SrcSpan -> RdrName -> Located RdrName
forall l e. l -> e -> GenLocated l e
L SrcSpan
loc RdrName
lbl))
Right [Name
sel_name] ->
SrcSpan
-> AmbiguousFieldOcc (GhcPass 'Renamed)
-> GenLocated SrcSpan (AmbiguousFieldOcc (GhcPass 'Renamed))
forall l e. l -> e -> GenLocated l e
L SrcSpan
loc (XUnambiguous (GhcPass 'Renamed)
-> Located RdrName -> AmbiguousFieldOcc (GhcPass 'Renamed)
forall pass.
XUnambiguous pass -> Located RdrName -> AmbiguousFieldOcc pass
Unambiguous Name
XUnambiguous (GhcPass 'Renamed)
sel_name (SrcSpan -> RdrName -> Located RdrName
forall l e. l -> e -> GenLocated l e
L SrcSpan
loc RdrName
lbl))
Right [Name]
_ -> SrcSpan
-> AmbiguousFieldOcc (GhcPass 'Renamed)
-> GenLocated SrcSpan (AmbiguousFieldOcc (GhcPass 'Renamed))
forall l e. l -> e -> GenLocated l e
L SrcSpan
loc (XAmbiguous (GhcPass 'Renamed)
-> Located RdrName -> AmbiguousFieldOcc (GhcPass 'Renamed)
forall pass.
XAmbiguous pass -> Located RdrName -> AmbiguousFieldOcc pass
Ambiguous XAmbiguous (GhcPass 'Renamed)
NoExtField
noExtField (SrcSpan -> RdrName -> Located RdrName
forall l e. l -> e -> GenLocated l e
L SrcSpan
loc RdrName
lbl))
; (LHsRecUpdField (GhcPass 'Renamed), FreeVars)
-> IOEnv
(Env TcGblEnv TcLclEnv)
(LHsRecUpdField (GhcPass 'Renamed), FreeVars)
forall (m :: * -> *) a. Monad m => a -> m a
External instance of the constraint type forall m. Monad (IOEnv m)
return (SrcSpan
-> HsRecField'
(AmbiguousFieldOcc (GhcPass 'Renamed)) (LHsExpr (GhcPass 'Renamed))
-> LHsRecUpdField (GhcPass 'Renamed)
forall l e. l -> e -> GenLocated l e
L SrcSpan
l (HsRecField :: forall id arg. Located id -> arg -> Bool -> HsRecField' id arg
HsRecField { hsRecFieldLbl :: GenLocated SrcSpan (AmbiguousFieldOcc (GhcPass 'Renamed))
hsRecFieldLbl = GenLocated SrcSpan (AmbiguousFieldOcc (GhcPass 'Renamed))
lbl'
, hsRecFieldArg :: LHsExpr (GhcPass 'Renamed)
hsRecFieldArg = LHsExpr (GhcPass 'Renamed)
arg''
, hsRecPun :: Bool
hsRecPun = Bool
pun }), FreeVars
fvs') }
dup_flds :: [NE.NonEmpty RdrName]
([RdrName]
_, [NonEmpty RdrName]
dup_flds) = (RdrName -> RdrName -> Ordering)
-> [RdrName] -> ([RdrName], [NonEmpty RdrName])
forall a. (a -> a -> Ordering) -> [a] -> ([a], [NonEmpty a])
removeDups RdrName -> RdrName -> Ordering
forall a. Ord a => a -> a -> Ordering
External instance of the constraint type Ord RdrName
compare ([LHsRecUpdField GhcPs] -> [RdrName]
getFieldUpdLbls [LHsRecUpdField GhcPs]
flds)
getFieldIds :: [LHsRecField GhcRn arg] -> [Name]
getFieldIds :: [LHsRecField (GhcPass 'Renamed) arg] -> [Name]
getFieldIds [LHsRecField (GhcPass 'Renamed) arg]
flds = (LHsRecField (GhcPass 'Renamed) arg -> Name)
-> [LHsRecField (GhcPass 'Renamed) arg] -> [Name]
forall a b. (a -> b) -> [a] -> [b]
map (Located Name -> Name
forall l e. GenLocated l e -> e
unLoc (Located Name -> Name)
-> (LHsRecField (GhcPass 'Renamed) arg -> Located Name)
-> LHsRecField (GhcPass 'Renamed) arg
-> Name
forall b c a. (b -> c) -> (a -> b) -> a -> c
. HsRecField (GhcPass 'Renamed) arg -> Located Name
forall pass arg. HsRecField pass arg -> Located (XCFieldOcc pass)
hsRecFieldSel (HsRecField (GhcPass 'Renamed) arg -> Located Name)
-> (LHsRecField (GhcPass 'Renamed) arg
-> HsRecField (GhcPass 'Renamed) arg)
-> LHsRecField (GhcPass 'Renamed) arg
-> Located Name
forall b c a. (b -> c) -> (a -> b) -> a -> c
. LHsRecField (GhcPass 'Renamed) arg
-> HsRecField (GhcPass 'Renamed) arg
forall l e. GenLocated l e -> e
unLoc) [LHsRecField (GhcPass 'Renamed) arg]
flds
getFieldLbls :: [LHsRecField id arg] -> [RdrName]
getFieldLbls :: [LHsRecField id arg] -> [RdrName]
getFieldLbls [LHsRecField id arg]
flds
= (LHsRecField id arg -> RdrName)
-> [LHsRecField id arg] -> [RdrName]
forall a b. (a -> b) -> [a] -> [b]
map (Located RdrName -> RdrName
forall l e. GenLocated l e -> e
unLoc (Located RdrName -> RdrName)
-> (LHsRecField id arg -> Located RdrName)
-> LHsRecField id arg
-> RdrName
forall b c a. (b -> c) -> (a -> b) -> a -> c
. FieldOcc id -> Located RdrName
forall pass. FieldOcc pass -> Located RdrName
rdrNameFieldOcc (FieldOcc id -> Located RdrName)
-> (LHsRecField id arg -> FieldOcc id)
-> LHsRecField id arg
-> Located RdrName
forall b c a. (b -> c) -> (a -> b) -> a -> c
. GenLocated SrcSpan (FieldOcc id) -> FieldOcc id
forall l e. GenLocated l e -> e
unLoc (GenLocated SrcSpan (FieldOcc id) -> FieldOcc id)
-> (LHsRecField id arg -> GenLocated SrcSpan (FieldOcc id))
-> LHsRecField id arg
-> FieldOcc id
forall b c a. (b -> c) -> (a -> b) -> a -> c
. HsRecField' (FieldOcc id) arg -> GenLocated SrcSpan (FieldOcc id)
forall id arg. HsRecField' id arg -> Located id
hsRecFieldLbl (HsRecField' (FieldOcc id) arg -> GenLocated SrcSpan (FieldOcc id))
-> (LHsRecField id arg -> HsRecField' (FieldOcc id) arg)
-> LHsRecField id arg
-> GenLocated SrcSpan (FieldOcc id)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. LHsRecField id arg -> HsRecField' (FieldOcc id) arg
forall l e. GenLocated l e -> e
unLoc) [LHsRecField id arg]
flds
getFieldUpdLbls :: [LHsRecUpdField GhcPs] -> [RdrName]
getFieldUpdLbls :: [LHsRecUpdField GhcPs] -> [RdrName]
getFieldUpdLbls [LHsRecUpdField GhcPs]
flds = (LHsRecUpdField GhcPs -> RdrName)
-> [LHsRecUpdField GhcPs] -> [RdrName]
forall a b. (a -> b) -> [a] -> [b]
map (AmbiguousFieldOcc GhcPs -> RdrName
forall (p :: Pass). AmbiguousFieldOcc (GhcPass p) -> RdrName
rdrNameAmbiguousFieldOcc (AmbiguousFieldOcc GhcPs -> RdrName)
-> (LHsRecUpdField GhcPs -> AmbiguousFieldOcc GhcPs)
-> LHsRecUpdField GhcPs
-> RdrName
forall b c a. (b -> c) -> (a -> b) -> a -> c
. GenLocated SrcSpan (AmbiguousFieldOcc GhcPs)
-> AmbiguousFieldOcc GhcPs
forall l e. GenLocated l e -> e
unLoc (GenLocated SrcSpan (AmbiguousFieldOcc GhcPs)
-> AmbiguousFieldOcc GhcPs)
-> (LHsRecUpdField GhcPs
-> GenLocated SrcSpan (AmbiguousFieldOcc GhcPs))
-> LHsRecUpdField GhcPs
-> AmbiguousFieldOcc GhcPs
forall b c a. (b -> c) -> (a -> b) -> a -> c
. HsRecField' (AmbiguousFieldOcc GhcPs) (LHsExpr GhcPs)
-> GenLocated SrcSpan (AmbiguousFieldOcc GhcPs)
forall id arg. HsRecField' id arg -> Located id
hsRecFieldLbl (HsRecField' (AmbiguousFieldOcc GhcPs) (LHsExpr GhcPs)
-> GenLocated SrcSpan (AmbiguousFieldOcc GhcPs))
-> (LHsRecUpdField GhcPs
-> HsRecField' (AmbiguousFieldOcc GhcPs) (LHsExpr GhcPs))
-> LHsRecUpdField GhcPs
-> GenLocated SrcSpan (AmbiguousFieldOcc GhcPs)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. LHsRecUpdField GhcPs
-> HsRecField' (AmbiguousFieldOcc GhcPs) (LHsExpr GhcPs)
forall l e. GenLocated l e -> e
unLoc) [LHsRecUpdField GhcPs]
flds
needFlagDotDot :: HsRecFieldContext -> SDoc
needFlagDotDot :: HsRecFieldContext -> MsgDoc
needFlagDotDot HsRecFieldContext
ctxt = [MsgDoc] -> MsgDoc
vcat [String -> MsgDoc
text String
"Illegal `..' in record" MsgDoc -> MsgDoc -> MsgDoc
<+> HsRecFieldContext -> MsgDoc
pprRFC HsRecFieldContext
ctxt,
String -> MsgDoc
text String
"Use RecordWildCards to permit this"]
badDotDotCon :: Name -> SDoc
badDotDotCon :: Name -> MsgDoc
badDotDotCon Name
con
= [MsgDoc] -> MsgDoc
vcat [ String -> MsgDoc
text String
"Illegal `..' notation for constructor" MsgDoc -> MsgDoc -> MsgDoc
<+> MsgDoc -> MsgDoc
quotes (Name -> MsgDoc
forall a. Outputable a => a -> MsgDoc
External instance of the constraint type Outputable Name
ppr Name
con)
, Int -> MsgDoc -> MsgDoc
nest Int
2 (String -> MsgDoc
text String
"The constructor has no labelled fields") ]
emptyUpdateErr :: SDoc
emptyUpdateErr :: MsgDoc
emptyUpdateErr = String -> MsgDoc
text String
"Empty record update"
badPun :: Located RdrName -> SDoc
badPun :: Located RdrName -> MsgDoc
badPun Located RdrName
fld = [MsgDoc] -> MsgDoc
vcat [String -> MsgDoc
text String
"Illegal use of punning for field" MsgDoc -> MsgDoc -> MsgDoc
<+> MsgDoc -> MsgDoc
quotes (Located RdrName -> MsgDoc
forall a. Outputable a => a -> MsgDoc
External instance of the constraint type forall l e.
(Outputable l, Outputable e) =>
Outputable (GenLocated l e)
External instance of the constraint type Outputable SrcSpan
External instance of the constraint type Outputable RdrName
ppr Located RdrName
fld),
String -> MsgDoc
text String
"Use NamedFieldPuns to permit this"]
dupFieldErr :: HsRecFieldContext -> NE.NonEmpty RdrName -> SDoc
dupFieldErr :: HsRecFieldContext -> NonEmpty RdrName -> MsgDoc
dupFieldErr HsRecFieldContext
ctxt NonEmpty RdrName
dups
= [MsgDoc] -> MsgDoc
hsep [String -> MsgDoc
text String
"duplicate field name",
MsgDoc -> MsgDoc
quotes (RdrName -> MsgDoc
forall a. Outputable a => a -> MsgDoc
External instance of the constraint type Outputable RdrName
ppr (NonEmpty RdrName -> RdrName
forall a. NonEmpty a -> a
NE.head NonEmpty RdrName
dups)),
String -> MsgDoc
text String
"in record", HsRecFieldContext -> MsgDoc
pprRFC HsRecFieldContext
ctxt]
pprRFC :: HsRecFieldContext -> SDoc
pprRFC :: HsRecFieldContext -> MsgDoc
pprRFC (HsRecFieldCon {}) = String -> MsgDoc
text String
"construction"
pprRFC (HsRecFieldPat {}) = String -> MsgDoc
text String
"pattern"
pprRFC (HsRecFieldUpd {}) = String -> MsgDoc
text String
"update"
rnLit :: HsLit p -> RnM ()
rnLit :: HsLit p -> IOEnv (Env TcGblEnv TcLclEnv) ()
rnLit (HsChar XHsChar p
_ Char
c) = Bool -> MsgDoc -> IOEnv (Env TcGblEnv TcLclEnv) ()
checkErr (Char -> Bool
inCharRange Char
c) (Char -> MsgDoc
bogusCharError Char
c)
rnLit HsLit p
_ = () -> IOEnv (Env TcGblEnv TcLclEnv) ()
forall (m :: * -> *) a. Monad m => a -> m a
External instance of the constraint type forall m. Monad (IOEnv m)
return ()
generalizeOverLitVal :: OverLitVal -> OverLitVal
generalizeOverLitVal :: OverLitVal -> OverLitVal
generalizeOverLitVal (HsFractional (FL {fl_text :: FractionalLit -> SourceText
fl_text=SourceText
src,fl_neg :: FractionalLit -> Bool
fl_neg=Bool
neg,fl_value :: FractionalLit -> Rational
fl_value=Rational
val}))
| Rational -> Integer
forall a. Ratio a -> a
denominator Rational
val Integer -> Integer -> Bool
forall a. Eq a => a -> a -> Bool
External instance of the constraint type Eq Integer
== Integer
1 = IntegralLit -> OverLitVal
HsIntegral (IL :: SourceText -> Bool -> Integer -> IntegralLit
IL { il_text :: SourceText
il_text=SourceText
src
, il_neg :: Bool
il_neg=Bool
neg
, il_value :: Integer
il_value=Rational -> Integer
forall a. Ratio a -> a
numerator Rational
val})
generalizeOverLitVal OverLitVal
lit = OverLitVal
lit
isNegativeZeroOverLit :: HsOverLit t -> Bool
isNegativeZeroOverLit :: HsOverLit t -> Bool
isNegativeZeroOverLit HsOverLit t
lit
= case HsOverLit t -> OverLitVal
forall p. HsOverLit p -> OverLitVal
ol_val HsOverLit t
lit of
HsIntegral IntegralLit
i -> Integer
0 Integer -> Integer -> Bool
forall a. Eq a => a -> a -> Bool
External instance of the constraint type Eq Integer
== IntegralLit -> Integer
il_value IntegralLit
i Bool -> Bool -> Bool
&& IntegralLit -> Bool
il_neg IntegralLit
i
HsFractional FractionalLit
f -> Rational
0 Rational -> Rational -> Bool
forall a. Eq a => a -> a -> Bool
External instance of the constraint type forall a. Eq a => Eq (Ratio a)
External instance of the constraint type Eq Integer
== FractionalLit -> Rational
fl_value FractionalLit
f Bool -> Bool -> Bool
&& FractionalLit -> Bool
fl_neg FractionalLit
f
OverLitVal
_ -> Bool
False
rnOverLit :: HsOverLit t ->
RnM ((HsOverLit GhcRn, Maybe (HsExpr GhcRn)), FreeVars)
rnOverLit :: HsOverLit t
-> RnM
((HsOverLit (GhcPass 'Renamed), Maybe (HsExpr (GhcPass 'Renamed))),
FreeVars)
rnOverLit HsOverLit t
origLit
= do { Bool
opt_NumDecimals <- Extension -> RnM Bool
forall gbl lcl. Extension -> TcRnIf gbl lcl Bool
xoptM Extension
LangExt.NumDecimals
; let { lit :: HsOverLit t
lit@(OverLit {ol_val :: forall p. HsOverLit p -> OverLitVal
ol_val=OverLitVal
val})
| Bool
opt_NumDecimals = HsOverLit t
origLit {ol_val :: OverLitVal
ol_val = OverLitVal -> OverLitVal
generalizeOverLitVal (HsOverLit t -> OverLitVal
forall p. HsOverLit p -> OverLitVal
ol_val HsOverLit t
origLit)}
| Bool
otherwise = HsOverLit t
origLit
}
; let std_name :: Name
std_name = OverLitVal -> Name
hsOverLitName OverLitVal
val
; (Name
from_thing_name, FreeVars
fvs1) <- Name -> RnM (Name, FreeVars)
lookupSyntaxName Name
std_name
; let rebindable :: Bool
rebindable = Name
from_thing_name Name -> Name -> Bool
forall a. Eq a => a -> a -> Bool
External instance of the constraint type Eq Name
/= Name
std_name
lit' :: HsOverLit (GhcPass 'Renamed)
lit' = HsOverLit t
lit { ol_witness :: HsExpr (GhcPass 'Renamed)
ol_witness = IdP (GhcPass 'Renamed) -> HsExpr (GhcPass 'Renamed)
forall (id :: Pass). IdP (GhcPass id) -> HsExpr (GhcPass id)
nl_HsVar Name
IdP (GhcPass 'Renamed)
from_thing_name
, ol_ext :: XOverLit (GhcPass 'Renamed)
ol_ext = Bool
XOverLit (GhcPass 'Renamed)
rebindable }
; if HsOverLit (GhcPass 'Renamed) -> Bool
forall t. HsOverLit t -> Bool
isNegativeZeroOverLit HsOverLit (GhcPass 'Renamed)
lit'
then do { (HsExpr (GhcPass 'Renamed)
negate_name, FreeVars
fvs2) <- Name -> RnM (HsExpr (GhcPass 'Renamed), FreeVars)
lookupSyntaxExpr Name
negateName
; ((HsOverLit (GhcPass 'Renamed), Maybe (HsExpr (GhcPass 'Renamed))),
FreeVars)
-> RnM
((HsOverLit (GhcPass 'Renamed), Maybe (HsExpr (GhcPass 'Renamed))),
FreeVars)
forall (m :: * -> *) a. Monad m => a -> m a
External instance of the constraint type forall m. Monad (IOEnv m)
return ((HsOverLit (GhcPass 'Renamed)
lit' { ol_val :: OverLitVal
ol_val = OverLitVal -> OverLitVal
negateOverLitVal OverLitVal
val }, HsExpr (GhcPass 'Renamed) -> Maybe (HsExpr (GhcPass 'Renamed))
forall a. a -> Maybe a
Just HsExpr (GhcPass 'Renamed)
negate_name)
, FreeVars
fvs1 FreeVars -> FreeVars -> FreeVars
`plusFV` FreeVars
fvs2) }
else ((HsOverLit (GhcPass 'Renamed), Maybe (HsExpr (GhcPass 'Renamed))),
FreeVars)
-> RnM
((HsOverLit (GhcPass 'Renamed), Maybe (HsExpr (GhcPass 'Renamed))),
FreeVars)
forall (m :: * -> *) a. Monad m => a -> m a
External instance of the constraint type forall m. Monad (IOEnv m)
return ((HsOverLit (GhcPass 'Renamed)
lit', Maybe (HsExpr (GhcPass 'Renamed))
forall a. Maybe a
Nothing), FreeVars
fvs1) }
patSigErr :: Outputable a => a -> SDoc
patSigErr :: a -> MsgDoc
patSigErr a
ty
= (String -> MsgDoc
text String
"Illegal signature in pattern:" MsgDoc -> MsgDoc -> MsgDoc
<+> a -> MsgDoc
forall a. Outputable a => a -> MsgDoc
Evidence bound by a type signature of the constraint type Outputable a
ppr a
ty)
MsgDoc -> MsgDoc -> MsgDoc
$$ Int -> MsgDoc -> MsgDoc
nest Int
4 (String -> MsgDoc
text String
"Use ScopedTypeVariables to permit it")
bogusCharError :: Char -> SDoc
bogusCharError :: Char -> MsgDoc
bogusCharError Char
c
= String -> MsgDoc
text String
"character literal out of range: '\\" MsgDoc -> MsgDoc -> MsgDoc
<> Char -> MsgDoc
char Char
c MsgDoc -> MsgDoc -> MsgDoc
<> Char -> MsgDoc
char Char
'\''
badViewPat :: Pat GhcPs -> SDoc
badViewPat :: Pat GhcPs -> MsgDoc
badViewPat Pat GhcPs
pat = [MsgDoc] -> MsgDoc
vcat [String -> MsgDoc
text String
"Illegal view pattern: " MsgDoc -> MsgDoc -> MsgDoc
<+> Pat GhcPs -> MsgDoc
forall a. Outputable a => a -> MsgDoc
External instance of the constraint type forall (p :: Pass).
OutputableBndrId p =>
Outputable (Pat (GhcPass p))
External instance of the constraint type OutputableBndr RdrName
External instance of the constraint type OutputableBndr RdrName
External instance of the constraint type IsPass 'Parsed
ppr Pat GhcPs
pat,
String -> MsgDoc
text String
"Use ViewPatterns to enable view patterns"]