summaryrefslogtreecommitdiff
path: root/compiler/GHC/HsToCore/PmCheck.hs
diff options
context:
space:
mode:
Diffstat (limited to 'compiler/GHC/HsToCore/PmCheck.hs')
-rw-r--r--compiler/GHC/HsToCore/PmCheck.hs40
1 files changed, 23 insertions, 17 deletions
diff --git a/compiler/GHC/HsToCore/PmCheck.hs b/compiler/GHC/HsToCore/PmCheck.hs
index 5e8a80fdcc..637a8fd7e9 100644
--- a/compiler/GHC/HsToCore/PmCheck.hs
+++ b/compiler/GHC/HsToCore/PmCheck.hs
@@ -470,20 +470,18 @@ translatePat :: FamInstEnvs -> Id -> Pat GhcTc -> DsM GrdVec
translatePat fam_insts x pat = case pat of
WildPat _ty -> pure []
VarPat _ y -> pure (mkPmLetVar (unLoc y) x)
- -- XPat wraps a Located (Pat GhcTc) in GhcTc. The Located part is important
- XPat p -> translatePat fam_insts x (unLoc p)
- ParPat _ p -> translatePat fam_insts x p
+ ParPat _ p -> translateLPat fam_insts x p
LazyPat _ _ -> pure [] -- like a wildcard
BangPat _ p ->
-- Add the bang in front of the list, because it will happen before any
-- nested stuff.
- (PmBang x :) <$> translatePat fam_insts x p
+ (PmBang x :) <$> translateLPat fam_insts x p
-- (x@pat) ==> Translate pat with x as match var and handle impedance
-- mismatch with incoming match var
- AsPat _ (dL->L _ y) p -> (mkPmLetVar y x ++) <$> translatePat fam_insts y p
+ AsPat _ (dL->L _ y) p -> (mkPmLetVar y x ++) <$> translateLPat fam_insts y p
- SigPat _ p _ty -> translatePat fam_insts x p
+ SigPat _ p _ty -> translateLPat fam_insts x p
-- See Note [Translate CoPats]
-- Generally the translation is
@@ -507,7 +505,7 @@ translatePat fam_insts x pat = case pat of
-- (fun -> pat) ===> let y = fun x, pat <- y where y is a match var of pat
ViewPat _arg_ty lexpr pat -> do
- (y, grds) <- translatePatV fam_insts pat
+ (y, grds) <- translateLPatV fam_insts pat
fun <- dsLExpr lexpr
pure $ PmLet y (App fun (Var x)) : grds
@@ -576,12 +574,12 @@ translatePat fam_insts x pat = case pat of
mkPmLitGrds x lit
TuplePat _tys pats boxity -> do
- (vars, grdss) <- mapAndUnzipM (translatePatV fam_insts) pats
+ (vars, grdss) <- mapAndUnzipM (translateLPatV fam_insts) pats
let tuple_con = tupleDataCon boxity (length vars)
pure $ vanillaConGrd x tuple_con vars : concat grdss
SumPat _ty p alt arity -> do
- (y, grds) <- translatePatV fam_insts p
+ (y, grds) <- translateLPatV fam_insts p
let sum_con = sumDataCon alt arity
-- See Note [Unboxed tuple RuntimeRep vars] in TyCon
pure $ vanillaConGrd x sum_con [y] : grds
@@ -590,6 +588,7 @@ translatePat fam_insts x pat = case pat of
-- Not supposed to happen
ConPatIn {} -> panic "Check.translatePat: ConPatIn"
SplicePat {} -> panic "Check.translatePat: SplicePat"
+ XPat n -> noExtCon n
-- | 'translatePat', but also select and return a new match var.
translatePatV :: FamInstEnvs -> Pat GhcTc -> DsM (Id, GrdVec)
@@ -598,12 +597,19 @@ translatePatV fam_insts pat = do
grds <- translatePat fam_insts x pat
pure (x, grds)
+translateLPat :: FamInstEnvs -> Id -> LPat GhcTc -> DsM GrdVec
+translateLPat fam_insts x = translatePat fam_insts x . unLoc
+
+-- | 'translateLPat', but also select and return a new match var.
+translateLPatV :: FamInstEnvs -> LPat GhcTc -> DsM (Id, GrdVec)
+translateLPatV fam_insts = translatePatV fam_insts . unLoc
+
-- | @translateListPat _ x [p1, ..., pn]@ is basically
-- @translateConPatOut _ x $(mkListConPatOuts [p1, ..., pn]>@ without ever
-- constructing the 'ConPatOut's.
-translateListPat :: FamInstEnvs -> Id -> [Pat GhcTc] -> DsM GrdVec
+translateListPat :: FamInstEnvs -> Id -> [LPat GhcTc] -> DsM GrdVec
translateListPat fam_insts x pats = do
- vars_and_grdss <- traverse (translatePatV fam_insts) pats
+ vars_and_grdss <- traverse (translateLPatV fam_insts) pats
mkListGrds x vars_and_grdss
-- | Translate a constructor pattern
@@ -637,7 +643,7 @@ translateConPatOut fam_insts x con univ_tys ex_tvs dicts = \case
-- Translate the mentioned field patterns. We're doing this first to get
-- the Ids for pm_con_args.
let trans_pat (n, pat) = do
- (var, pvec) <- translatePatV fam_insts pat
+ (var, pvec) <- translateLPatV fam_insts pat
pure ((n, var), pvec)
(tagged_vars, arg_grdss) <- mapAndUnzipM trans_pat tagged_pats
@@ -667,7 +673,7 @@ translateMatch :: FamInstEnvs -> [Id] -> LMatch GhcTc (LHsExpr GhcTc)
-> DsM (GrdVec, [GrdVec])
translateMatch fam_insts vars (dL->L _ (Match { m_pats = pats, m_grhss = grhss }))
= do
- pats' <- concat <$> zipWithM (translatePat fam_insts) vars pats
+ pats' <- concat <$> zipWithM (translateLPat fam_insts) vars pats
guards' <- mapM (translateGuards fam_insts) guards
-- tracePm "translateMatch" (vcat [ppr pats, ppr pats', ppr guards, ppr guards'])
return (pats', guards')
@@ -706,15 +712,15 @@ translateLet _binds = return []
-- | Translate a pattern guard
-- @pat <- e ==> let x = e; <guards for pat <- x>@
-translateBind :: FamInstEnvs -> Pat GhcTc -> LHsExpr GhcTc -> DsM GrdVec
+translateBind :: FamInstEnvs -> LPat GhcTc -> LHsExpr GhcTc -> DsM GrdVec
translateBind fam_insts p e = dsLExpr e >>= \case
Var y
| Nothing <- isDataConId_maybe y
-- RHS is a variable, so that will allow us to omit the let
- -> translatePat fam_insts y p
+ -> translateLPat fam_insts y p
rhs -> do
- x <- selectMatchVar p
- (PmLet x rhs :) <$> translatePat fam_insts x p
+ (x, grds) <- translateLPatV fam_insts p
+ pure (PmLet x rhs : grds)
-- | Translate a boolean guard
-- @e ==> let x = e; True <- x@