on master help sign in
Add code for canonicalizing case expressions
commitb49e8f7918590b227df09606e674a1281603605a authorEvan Czaplicki <evancz@users.noreply.github.com> dateMon 30 Oct 2017, 23:22 (9 years ago) parent8b88494
1 file changed+23−6
src/Canonicalize/Expression.hs+23−6
src/Canonicalize/Expression.hs+23−6
@@ -5,13 +5,13 @@ module Canonicalize.Expression
55 where
66
77
8−import Control.Applicative (liftA2)
98import qualified Data.Graph as Graph
109import qualified Data.Map.Strict as Map
1110import qualified Data.Set as Set
1211
1312import qualified AST.Binop as Binop
1413import qualified AST.Expression.Canonical as Can
14+import qualified AST.Expression.Source as Src
1515import qualified AST.Expression.Valid as Valid
1616import qualified Canonicalize.Environment as Env
1717import qualified Canonicalize.Environment.Dups as Dups
@@ -78,14 +78,16 @@ canonicalize env (A.A region expression) =
7878
7979 Valid.If branches finally ->
8080 Can.If
81− <$> traverse (canonicalizeBranch env) branches
81+ <$> traverse (canonicalizeIfBranch env) branches
8282 <*> canonicalize env finally
8383
8484 Valid.Let defs expr ->
8585 A.drop <$> canonicalizeLet region env defs expr
8686
8787 Valid.Case expr cases ->
88− error "TODO"
88+ Can.Case
89+ <$> canonicalize env expr
90+ <*> traverse (canonicalizeCaseBranch env) cases
8991
9092 Valid.Accessor field ->
9193 Result.ok $ Can.Accessor field
@@ -140,9 +142,24 @@ canonicalizeTupleExtras region env extras =
140142-- CANONICALIZE IF BRANCH
141143
142144
143−canonicalizeBranch :: Env.Env -> (Valid.Expr, Valid.Expr) -> Result FreeLocals (Can.Expr, Can.Expr)
144−canonicalizeBranch env (condition, branch) =
145− liftA2 (,) (canonicalize env condition) (canonicalize env branch)
145+canonicalizeIfBranch :: Env.Env -> (Valid.Expr, Valid.Expr) -> Result FreeLocals (Can.Expr, Can.Expr)
146+canonicalizeIfBranch env (condition, branch) =
147+ (,)
148+ <$> canonicalize env condition
149+ <*> canonicalize env branch
150+
151+
152+
153+-- CANONICALIZE CASE BRANCH
154+
155+
156+canonicalizeCaseBranch :: Env.Env -> (Src.Pattern, Valid.Expr) -> Result FreeLocals (Can.Match, Can.Expr)
157+canonicalizeCaseBranch env (pattern, expr) =
158+ addLocals $
159+ do match@(Can.Match _ destructors) <- Pattern.canonicalizeMatch env pattern
160+ newEnv <- Env.addLocals destructors env
161+ removeLocals destructors $
162+ (,) match <$> canonicalize newEnv expr
146163
147164
148165