on master help sign in
Add code for canonicalizing case expressions
b49e8f7Evan Czaplicki
src/Canonicalize/Expression.hs+23−6
@@ -5,13 +5,13 @@ module Canonicalize.Expression
5 where
5 where
6
6
7
7
8−import Control.Applicative (liftA2)
9import qualified Data.Graph as Graph
8import qualified Data.Graph as Graph
10import qualified Data.Map.Strict as Map
9import qualified Data.Map.Strict as Map
11import qualified Data.Set as Set
10import qualified Data.Set as Set
12
11
13import qualified AST.Binop as Binop
12import qualified AST.Binop as Binop
14import qualified AST.Expression.Canonical as Can
13import qualified AST.Expression.Canonical as Can
14+import qualified AST.Expression.Source as Src
15import qualified AST.Expression.Valid as Valid
15import qualified AST.Expression.Valid as Valid
16import qualified Canonicalize.Environment as Env
16import qualified Canonicalize.Environment as Env
17import qualified Canonicalize.Environment.Dups as Dups
17import qualified Canonicalize.Environment.Dups as Dups
@@ -78,14 +78,16 @@ canonicalize env (A.A region expression) =
78
78
79 Valid.If branches finally ->
79 Valid.If branches finally ->
80 Can.If
80 Can.If
81− <$> traverse (canonicalizeBranch env) branches
81+ <$> traverse (canonicalizeIfBranch env) branches
82 <*> canonicalize env finally
82 <*> canonicalize env finally
83
83
84 Valid.Let defs expr ->
84 Valid.Let defs expr ->
85 A.drop <$> canonicalizeLet region env defs expr
85 A.drop <$> canonicalizeLet region env defs expr
86
86
87 Valid.Case expr cases ->
87 Valid.Case expr cases ->
88− error "TODO"
88+ Can.Case
89+ <$> canonicalize env expr
90+ <*> traverse (canonicalizeCaseBranch env) cases
89
91
90 Valid.Accessor field ->
92 Valid.Accessor field ->
91 Result.ok $ Can.Accessor field
93 Result.ok $ Can.Accessor field
@@ -140,9 +142,24 @@ canonicalizeTupleExtras region env extras =
140-- CANONICALIZE IF BRANCH
142-- CANONICALIZE IF BRANCH
141
143
142
144
143−canonicalizeBranch :: Env.Env -> (Valid.Expr, Valid.Expr) -> Result FreeLocals (Can.Expr, Can.Expr)
145+canonicalizeIfBranch :: Env.Env -> (Valid.Expr, Valid.Expr) -> Result FreeLocals (Can.Expr, Can.Expr)
144−canonicalizeBranch env (condition, branch) =
146+canonicalizeIfBranch env (condition, branch) =
147+ (,)
145− liftA2 (,) (canonicalize env condition) (canonicalize env branch)
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
146
163
147
164
148
165