ghc-9.10.3: The GHC API

Safe Haskell | None
Language | GHC2021

GHC.HsToCore.Utils

Description

Utility functions for constructing Core syntax, principally for desugaring

Synopsis

- data EquationInfo
  - = EqnMatch {
    - eqn_pat :: LPat GhcTc
    - eqn_rest :: EquationInfo
    }
  - | EqnDone (MatchResult CoreExpr)
- firstPat :: EquationInfoNE -> Pat GhcTc
- shiftEqns :: Functor f => f EquationInfoNE -> f EquationInfo
- combineEqnRhss :: NonEmpty EquationInfo -> DsM (MatchResult CoreExpr)
- data MatchResult a
  - = MR_Infallible (DsM a)
  - | MR_Fallible (CoreExpr -> DsM a)
- data CaseAlt a = MkCaseAlt {
  - alt_pat :: a
  - alt_bndrs :: [Var]
  - alt_wrapper :: HsWrapper
  - alt_result :: MatchResult CoreExpr
  }
- cantFailMatchResult :: CoreExpr -> MatchResult CoreExpr
- alwaysFailMatchResult :: MatchResult CoreExpr
- extractMatchResult :: MatchResult CoreExpr -> CoreExpr -> DsM CoreExpr
- combineMatchResults :: MatchResult CoreExpr -> MatchResult CoreExpr -> MatchResult CoreExpr
- adjustMatchResultDs :: (a -> DsM b) -> MatchResult a -> MatchResult b
- shareFailureHandler :: MatchResult CoreExpr -> MatchResult CoreExpr
- dsHandleMonadicFailure :: HsDoFlavour -> LPat GhcTc -> MatchResult CoreExpr -> FailOperator GhcTc -> DsM CoreExpr
- mkCoLetMatchResult :: CoreBind -> MatchResult CoreExpr -> MatchResult CoreExpr
- mkViewMatchResult :: Id -> CoreExpr -> MatchResult CoreExpr -> MatchResult CoreExpr
- mkGuardedMatchResult :: CoreExpr -> MatchResult CoreExpr -> MatchResult CoreExpr
- matchCanFail :: MatchResult a -> Bool
- mkEvalMatchResult :: Id -> Type -> MatchResult CoreExpr -> MatchResult CoreExpr
- mkCoPrimCaseMatchResult :: Id -> Type -> [(Literal, MatchResult CoreExpr)] -> MatchResult CoreExpr
- mkCoAlgCaseMatchResult :: Id -> Type -> NonEmpty (CaseAlt DataCon) -> MatchResult CoreExpr
- mkCoSynCaseMatchResult :: Id -> Type -> CaseAlt PatSyn -> MatchResult CoreExpr
- wrapBind :: Var -> Var -> CoreExpr -> CoreExpr
- wrapBinds :: [(Var, Var)] -> CoreExpr -> CoreExpr
- mkErrorAppDs :: Id -> Type -> SDoc -> DsM CoreExpr
- mkCoreAppDs :: SDoc -> CoreExpr -> CoreExpr -> CoreExpr
- mkCoreAppsDs :: SDoc -> CoreExpr -> [CoreExpr] -> CoreExpr
- mkCastDs :: CoreExpr -> Coercion -> CoreExpr
- mkFailExpr :: HsMatchContextRn -> Type -> DsM CoreExpr
- seqVar :: Var -> CoreExpr -> CoreExpr
- mkLHsPatTup :: [LPat GhcTc] -> LPat GhcTc
- mkVanillaTuplePat :: [LPat GhcTc] -> Boxity -> Pat GhcTc
- mkBigLHsVarTupId :: [Id] -> LHsExpr GhcTc
- mkBigLHsTupId :: [LHsExpr GhcTc] -> LHsExpr GhcTc
- mkBigLHsVarPatTupId :: [Id] -> LPat GhcTc
- mkBigLHsPatTupId :: [LPat GhcTc] -> LPat GhcTc
- mkSelectorBinds :: [[CoreTickish]] -> LPat GhcTc -> HsMatchContextRn -> CoreExpr -> DsM (Id, [(Id, CoreExpr)])
- selectSimpleMatchVarL :: Mult -> LPat GhcTc -> DsM Id
- selectMatchVars :: [(Mult, Pat GhcTc)] -> DsM [Id]
- selectMatchVar :: Mult -> Pat GhcTc -> DsM Id
- mkOptTickBox :: [CoreTickish] -> CoreExpr -> CoreExpr
- mkBinaryTickBox :: Int -> Int -> CoreExpr -> DsM CoreExpr
- decideBangHood :: DynFlags -> LPat GhcTc -> LPat GhcTc
- isTrueLHsExpr :: LHsExpr GhcTc -> Maybe (CoreExpr -> DsM CoreExpr)

# Documentation

data EquationInfo Source #

Constructors

EqnMatch |

Fields

- eqn_pat :: LPat GhcTc

  The first pattern of the equation

  NB: The location info is used to determine whether the pattern is generated or not. This helps us avoid warnings on patterns that GHC elaborated.

  NB: We have already applied `decideBangHood` to this pattern. See Note [decideBangHood] in GHC.HsToCore.Utils

- eqn_rest :: EquationInfo

  The rest of the equation after its first pattern

EqnDone (MatchResult CoreExpr) | What to do after match

#### Instances

Instances details

Outputable EquationInfo Source # |
Instance details Defined in GHC.HsToCore.Monad Methods ppr :: EquationInfo -> SDoc Source #

firstPat :: EquationInfoNE -> Pat GhcTc Source #

shiftEqns :: Functor f => f EquationInfoNE -> f EquationInfo Source #

combineEqnRhss :: NonEmpty EquationInfo -> DsM (MatchResult CoreExpr) Source #

data MatchResult a Source #

This is a value of type a with potentially a CoreExpr-shaped hole in it. This is used to deal with cases where we are potentially handling pattern match failure, and want to later specify how failure is handled.

Constructors

MR_Infallible (DsM a) | We represent the case where there is no hole without a function from `CoreExpr`, like this, because sometimes we have nothing to put in the hole and so want to be sure there is in fact no hole.
MR_Fallible (CoreExpr -> DsM a) |

#### Instances

Instances details

Applicative MatchResult Source # | Product is an "or" on fallibility---the combined match result is infallible only if the left and right argument match results both were. This is useful for combining a bunch of alternatives together and then getting the overall fallibility of the entire group. See `mkDataConCase` for an example.
Instance details Defined in GHC.HsToCore.Monad Methods pure :: a -> MatchResult a # (<*>) :: MatchResult (a -> b) -> MatchResult a -> MatchResult b # liftA2 :: (a -> b -> c) -> MatchResult a -> MatchResult b -> MatchResult c # (*>) :: MatchResult a -> MatchResult b -> MatchResult b # (<*) :: MatchResult a -> MatchResult b -> MatchResult a #
Functor MatchResult Source # |
Instance details Defined in GHC.HsToCore.Monad Methods fmap :: (a -> b) -> MatchResult a -> MatchResult b # (<$) :: a -> MatchResult b -> MatchResult a #

data CaseAlt a Source #

Constructors

MkCaseAlt |

Fields

- alt_pat :: a
- alt_bndrs :: [Var]
- alt_wrapper :: HsWrapper
- alt_result :: MatchResult CoreExpr

cantFailMatchResult :: CoreExpr -> MatchResult CoreExpr Source #

alwaysFailMatchResult :: MatchResult CoreExpr Source #

extractMatchResult :: MatchResult CoreExpr -> CoreExpr -> DsM CoreExpr Source #

combineMatchResults :: MatchResult CoreExpr -> MatchResult CoreExpr -> MatchResult CoreExpr Source #

adjustMatchResultDs :: (a -> DsM b) -> MatchResult a -> MatchResult b Source #

shareFailureHandler :: MatchResult CoreExpr -> MatchResult CoreExpr Source #

dsHandleMonadicFailure :: HsDoFlavour -> LPat GhcTc -> MatchResult CoreExpr -> FailOperator GhcTc -> DsM CoreExpr Source #

mkCoLetMatchResult :: CoreBind -> MatchResult CoreExpr -> MatchResult CoreExpr Source #

mkViewMatchResult :: Id -> CoreExpr -> MatchResult CoreExpr -> MatchResult CoreExpr Source #

mkGuardedMatchResult :: CoreExpr -> MatchResult CoreExpr -> MatchResult CoreExpr Source #

matchCanFail :: MatchResult a -> Bool Source #

mkEvalMatchResult :: Id -> Type -> MatchResult CoreExpr -> MatchResult CoreExpr Source #

mkCoPrimCaseMatchResult :: Id -> Type -> [(Literal, MatchResult CoreExpr)] -> MatchResult CoreExpr Source #

mkCoAlgCaseMatchResult Source #

Arguments

:: Id | Scrutinee
-> Type | Type of exp
-> NonEmpty (CaseAlt DataCon) | Alternatives (bndrs *include* tyvars, dicts)
-> MatchResult CoreExpr |

mkCoSynCaseMatchResult :: Id -> Type -> CaseAlt PatSyn -> MatchResult CoreExpr Source #

wrapBind :: Var -> Var -> CoreExpr -> CoreExpr Source #

wrapBinds :: [(Var, Var)] -> CoreExpr -> CoreExpr Source #

mkErrorAppDs :: Id -> Type -> SDoc -> DsM CoreExpr Source #

mkCoreAppDs :: SDoc -> CoreExpr -> CoreExpr -> CoreExpr Source #

mkCoreAppsDs :: SDoc -> CoreExpr -> [CoreExpr] -> CoreExpr Source #

mkCastDs :: CoreExpr -> Coercion -> CoreExpr Source #

mkFailExpr :: HsMatchContextRn -> Type -> DsM CoreExpr Source #

seqVar :: Var -> CoreExpr -> CoreExpr Source #

mkLHsPatTup :: [LPat GhcTc] -> LPat GhcTc Source #

mkVanillaTuplePat :: [LPat GhcTc] -> Boxity -> Pat GhcTc Source #

mkBigLHsVarTupId :: [Id] -> LHsExpr GhcTc Source #

mkBigLHsTupId :: [LHsExpr GhcTc] -> LHsExpr GhcTc Source #

mkBigLHsVarPatTupId :: [Id] -> LPat GhcTc Source #

mkBigLHsPatTupId :: [LPat GhcTc] -> LPat GhcTc Source #

mkSelectorBinds Source #

Arguments

:: [[CoreTickish]] | ticks to add, possibly
-> LPat GhcTc | The pattern
-> HsMatchContextRn | Where the pattern occurs
-> CoreExpr | Expression to which the pattern is bound
-> DsM (Id, [(Id, CoreExpr)]) | Id the rhs is bound to, for desugaring strict binds (see Note [Desugar Strict binds] in GHC.HsToCore.Binds) and all the desugared binds

selectSimpleMatchVarL :: Mult -> LPat GhcTc -> DsM Id Source #

selectMatchVars :: [(Mult, Pat GhcTc)] -> DsM [Id] Source #

selectMatchVar :: Mult -> Pat GhcTc -> DsM Id Source #

mkOptTickBox :: [CoreTickish] -> CoreExpr -> CoreExpr Source #

mkBinaryTickBox :: Int -> Int -> CoreExpr -> DsM CoreExpr Source #

decideBangHood Source #

Arguments

:: DynFlags |
-> LPat GhcTc | Original pattern
-> LPat GhcTc |

Use -XStrict to add a ! or remove a ~ See Note [decideBangHood]

isTrueLHsExpr :: LHsExpr GhcTc -> Maybe (CoreExpr -> DsM CoreExpr) Source #