@@ -5,13 +5,13 @@ module Canonicalize.Expression
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
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) =
79 Valid.If branches finally ->
79 Valid.If branches finally ->
81− <$> traverse (canonicalizeBranch env) branches
81+ <$> traverse (canonicalizeIfBranch env) branches
82 <*> canonicalize env finally
82 <*> canonicalize env finally
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
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
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
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) =
145− liftA2 (,) (canonicalize env condition) (canonicalize env branch)
148+ <$> canonicalize env condition
149+ <*> canonicalize env branch
153+-- CANONICALIZE CASE BRANCH
156+canonicalizeCaseBranch :: Env.Env -> (Src.Pattern, Valid.Expr) -> Result FreeLocals (Can.Match, Can.Expr)
157+canonicalizeCaseBranch env (pattern, expr) =
159+ do match@(Can.Match _ destructors) <- Pattern.canonicalizeMatch env pattern
160+ newEnv <- Env.addLocals destructors env
161+ removeLocals destructors $
162+ (,) match <$> canonicalize newEnv expr