diff options
author | John Ericson <John.Ericson@Obsidian.Systems> | 2019-12-16 16:27:58 -0500 |
---|---|---|
committer | cgibbard <cgibbard@gmail.com> | 2020-04-17 13:08:47 -0400 |
commit | 79e27144db7011f6d01a2f5ed15fd110d579bb8e (patch) | |
tree | 77337bde4599308954d0d3cc4c676ef942e15529 /compiler/GHC/HsToCore | |
parent | a05348ebaa11d563ab2e33325055317ff3cb8afc (diff) | |
download | haskell-79e27144db7011f6d01a2f5ed15fd110d579bb8e.tar.gz |
Use trees that grow for rebindable operators for `<-` binds
Also add more documentation.
Diffstat (limited to 'compiler/GHC/HsToCore')
-rw-r--r-- | compiler/GHC/HsToCore/Arrows.hs | 2 | ||||
-rw-r--r-- | compiler/GHC/HsToCore/Coverage.hs | 22 | ||||
-rw-r--r-- | compiler/GHC/HsToCore/Expr.hs | 14 | ||||
-rw-r--r-- | compiler/GHC/HsToCore/GuardedRHSs.hs | 2 | ||||
-rw-r--r-- | compiler/GHC/HsToCore/ListComp.hs | 6 | ||||
-rw-r--r-- | compiler/GHC/HsToCore/PmCheck.hs | 2 | ||||
-rw-r--r-- | compiler/GHC/HsToCore/Quote.hs | 2 |
7 files changed, 26 insertions, 24 deletions
diff --git a/compiler/GHC/HsToCore/Arrows.hs b/compiler/GHC/HsToCore/Arrows.hs index 0371d37e31..856d48d946 100644 --- a/compiler/GHC/HsToCore/Arrows.hs +++ b/compiler/GHC/HsToCore/Arrows.hs @@ -866,7 +866,7 @@ dsCmdStmt ids local_vars out_ids (BodyStmt c_ty cmd _ _) env_ids = do -- It would be simpler and more consistent to do this using second, -- but that's likely to be defined in terms of first. -dsCmdStmt ids local_vars out_ids (BindStmt _ pat cmd _ _) env_ids = do +dsCmdStmt ids local_vars out_ids (BindStmt _ pat cmd) env_ids = do let pat_ty = hsLPatType pat (core_cmd, fv_cmd, env_ids1) <- dsfixCmd ids local_vars unitTy pat_ty cmd let pat_vars = mkVarSet (collectPatBinders pat) diff --git a/compiler/GHC/HsToCore/Coverage.hs b/compiler/GHC/HsToCore/Coverage.hs index 976248ae53..806758313a 100644 --- a/compiler/GHC/HsToCore/Coverage.hs +++ b/compiler/GHC/HsToCore/Coverage.hs @@ -709,12 +709,12 @@ addTickStmt _isGuard (LastStmt x e noret ret) = do (addTickLHsExpr e) (pure noret) (addTickSyntaxExpr hpcSrcSpan ret) -addTickStmt _isGuard (BindStmt x pat e bind fail) = do - liftM4 (BindStmt x) - (addTickLPat pat) - (addTickLHsExprRHS e) +addTickStmt _isGuard (BindStmt (bind, ty, fail) pat e) = do + liftM4 (\b f -> BindStmt (b, ty, f)) (addTickSyntaxExpr hpcSrcSpan bind) (mapM (addTickSyntaxExpr hpcSrcSpan) fail) + (addTickLPat pat) + (addTickLHsExprRHS e) addTickStmt isGuard (BodyStmt x e bind' guard') = do liftM3 (BodyStmt x) (addTick isGuard e) @@ -763,12 +763,12 @@ addTickApplicativeArg addTickApplicativeArg isGuard (op, arg) = liftM2 (,) (addTickSyntaxExpr hpcSrcSpan op) (addTickArg arg) where - addTickArg (ApplicativeArgOne x pat expr isBody fail) = - (ApplicativeArgOne x) - <$> addTickLPat pat + addTickArg (ApplicativeArgOne m_fail pat expr isBody) = + ApplicativeArgOne + <$> mapM (addTickSyntaxExpr hpcSrcSpan) m_fail + <*> addTickLPat pat <*> addTickLHsExpr expr <*> pure isBody - <*> mapM (addTickSyntaxExpr hpcSrcSpan) fail addTickArg (ApplicativeArgMany x stmts ret pat) = (ApplicativeArgMany x) <$> addTickLStmts isGuard stmts @@ -938,12 +938,10 @@ addTickLCmdStmts' lstmts res binders = collectLStmtsBinders lstmts addTickCmdStmt :: Stmt GhcTc (LHsCmd GhcTc) -> TM (Stmt GhcTc (LHsCmd GhcTc)) -addTickCmdStmt (BindStmt x pat c bind fail) = do - liftM4 (BindStmt x) +addTickCmdStmt (BindStmt x pat c) = do + liftM2 (BindStmt x) (addTickLPat pat) (addTickLHsCmd c) - (return bind) - (return fail) addTickCmdStmt (LastStmt x c noret ret) = do liftM3 (LastStmt x) (addTickLHsCmd c) diff --git a/compiler/GHC/HsToCore/Expr.hs b/compiler/GHC/HsToCore/Expr.hs index e9b59dddf3..72acc11efa 100644 --- a/compiler/GHC/HsToCore/Expr.hs +++ b/compiler/GHC/HsToCore/Expr.hs @@ -933,7 +933,7 @@ dsDo stmts = do { rest <- goL stmts ; dsLocalBinds binds rest } - go _ (BindStmt res1_ty pat rhs bind_op fail_op) stmts + go _ (BindStmt (bind_op, res1_ty, fail_op) pat rhs) stmts = do { body <- goL stmts ; rhs' <- dsLExpr rhs ; var <- selectSimpleMatchVarL pat @@ -947,7 +947,7 @@ dsDo stmts let (pats, rhss) = unzip (map (do_arg . snd) args) - do_arg (ApplicativeArgOne _ pat expr _ fail_op) = + do_arg (ApplicativeArgOne fail_op pat expr _) = ((pat, fail_op), dsLExpr expr) do_arg (ApplicativeArgMany _ stmts ret pat) = ((pat, Nothing), dsDo (stmts ++ [noLoc $ mkLastStmt (noLoc ret)])) @@ -981,9 +981,13 @@ dsDo stmts , recS_ret_ty = body_ty} }) stmts = goL (new_bind_stmt : stmts) -- rec_ids can be empty; eg rec { print 'x' } where - new_bind_stmt = L loc $ BindStmt bind_ty (mkBigLHsPatTupId later_pats) - mfix_app bind_op - Nothing -- Tuple cannot fail + new_bind_stmt = L loc $ BindStmt + ( bind_op + , bind_ty + , Nothing -- Tuple cannot fail + ) + (mkBigLHsPatTupId later_pats) + mfix_app tup_ids = rec_ids ++ filterOut (`elem` rec_ids) later_ids tup_ty = mkBigCoreTupTy (map idType tup_ids) -- Deals with singleton case diff --git a/compiler/GHC/HsToCore/GuardedRHSs.hs b/compiler/GHC/HsToCore/GuardedRHSs.hs index 5763fac71b..24db0f0649 100644 --- a/compiler/GHC/HsToCore/GuardedRHSs.hs +++ b/compiler/GHC/HsToCore/GuardedRHSs.hs @@ -122,7 +122,7 @@ matchGuards (LetStmt _ binds : stmts) ctx rhs rhs_ty = do -- so we can't desugar the bindings without the -- body expression in hand -matchGuards (BindStmt _ pat bind_rhs _ _ : stmts) ctx rhs rhs_ty = do +matchGuards (BindStmt _ pat bind_rhs : stmts) ctx rhs rhs_ty = do let upat = unLoc pat match_var <- selectMatchVar upat diff --git a/compiler/GHC/HsToCore/ListComp.hs b/compiler/GHC/HsToCore/ListComp.hs index f0f7aaf376..6571a5e974 100644 --- a/compiler/GHC/HsToCore/ListComp.hs +++ b/compiler/GHC/HsToCore/ListComp.hs @@ -241,7 +241,7 @@ deListComp (stmt@(TransStmt {}) : quals) list = do (inner_list_expr, pat) <- dsTransStmt stmt deBindComp pat inner_list_expr quals list -deListComp (BindStmt _ pat list1 _ _ : quals) core_list2 = do -- rule A' above +deListComp (BindStmt _ pat list1 : quals) core_list2 = do -- rule A' above core_list1 <- dsLExprNoLP list1 deBindComp pat core_list1 quals core_list2 @@ -349,7 +349,7 @@ dfListComp c_id n_id (stmt@(TransStmt {}) : quals) = do -- Anyway, we bind the newly grouped list via the generic binding function dfBindComp c_id n_id (pat, inner_list_expr) quals -dfListComp c_id n_id (BindStmt _ pat list1 _ _ : quals) = do +dfListComp c_id n_id (BindStmt _ pat list1 : quals) = do -- evaluate the two lists core_list1 <- dsLExpr list1 @@ -495,7 +495,7 @@ dsMcStmt (LetStmt _ binds) stmts ; dsLocalBinds binds rest } -- [ .. | a <- m, stmts ] -dsMcStmt (BindStmt bind_ty pat rhs bind_op fail_op) stmts +dsMcStmt (BindStmt (bind_op, bind_ty, fail_op) pat rhs) stmts = do { rhs' <- dsLExpr rhs ; dsMcBindStmt pat rhs' bind_op fail_op bind_ty stmts } diff --git a/compiler/GHC/HsToCore/PmCheck.hs b/compiler/GHC/HsToCore/PmCheck.hs index b22ef27d85..82dc98ee8b 100644 --- a/compiler/GHC/HsToCore/PmCheck.hs +++ b/compiler/GHC/HsToCore/PmCheck.hs @@ -660,7 +660,7 @@ translateGuard :: FamInstEnvs -> GuardStmt GhcTc -> DsM GrdVec translateGuard fam_insts guard = case guard of BodyStmt _ e _ _ -> translateBoolGuard e LetStmt _ binds -> translateLet (unLoc binds) - BindStmt _ p e _ _ -> translateBind fam_insts p e + BindStmt _ p e -> translateBind fam_insts p e LastStmt {} -> panic "translateGuard LastStmt" ParStmt {} -> panic "translateGuard ParStmt" TransStmt {} -> panic "translateGuard TransStmt" diff --git a/compiler/GHC/HsToCore/Quote.hs b/compiler/GHC/HsToCore/Quote.hs index d047170feb..40df5ec734 100644 --- a/compiler/GHC/HsToCore/Quote.hs +++ b/compiler/GHC/HsToCore/Quote.hs @@ -1613,7 +1613,7 @@ repLSts :: [LStmt GhcRn (LHsExpr GhcRn)] -> MetaM ([GenSymBind], [Core (M TH.Stm repLSts stmts = repSts (map unLoc stmts) repSts :: [Stmt GhcRn (LHsExpr GhcRn)] -> MetaM ([GenSymBind], [Core (M TH.Stmt)]) -repSts (BindStmt _ p e _ _ : ss) = +repSts (BindStmt _ p e : ss) = do { e2 <- repLE e ; ss1 <- mkGenSyms (collectPatBinders p) ; addBinds ss1 $ do { |