@@ -1,9 +1,15 @@
1{-# OPTIONS_GHC -Wall #-}
1{-# OPTIONS_GHC -Wall #-}
2{-# LANGUAGE OverloadedStrings #-}
2{-# LANGUAGE OverloadedStrings #-}
3module AST.Expression.Canonical
3module AST.Expression.Canonical
5− , Expr_(..)
4+ ( Expr, Expr_(..)
9+ , Pattern, Pattern_(..)
7 , Decl(..)
13 , Decl(..)
8 , Module(..)
14 , Module(..)
9 , Alias(..)
15 , Alias(..)
@@ -25,7 +31,6 @@ import Data.Text (Text)
25import qualified AST.Binop as Binop
31import qualified AST.Binop as Binop
26import qualified AST.Literal as Literal
32import qualified AST.Literal as Literal
27import qualified AST.Module.Name as ModuleName
33import qualified AST.Module.Name as ModuleName
28−import qualified AST.Pattern as Ptrn
29import qualified AST.Type as Type
34import qualified AST.Type as Type
30import qualified AST.Variable as Var
35import qualified AST.Variable as Var
31import qualified Elm.Name as N
36import qualified Elm.Name as N
@@ -39,7 +44,7 @@ import qualified Reporting.Region as R
41type Expr =
46type Expr =
42− A.Annotated R.Region Expr_
47+ A.Located Expr_
@@ -47,22 +52,25 @@ data Expr_
47 | VarTopLevel ModuleName.Canonical Name
52 | VarTopLevel ModuleName.Canonical Name
48 | VarKernel Name Name
53 | VarKernel Name Name
49 | VarForeign ModuleName.Canonical Name
54 | VarForeign ModuleName.Canonical Name
50− | VarOperator ModuleName.Canonical Name Name
55+ | VarOperator Name ModuleName.Canonical Name
51 | Literal Literal.Literal
56 | Literal Literal.Literal
52 | List [Expr]
57 | List [Expr]
53 | Binop Name ModuleName.Canonical Name Expr Expr
59 | Binop Name ModuleName.Canonical Name Expr Expr
54− | Lambda [Ptrn.Canonical] Expr
60+ | Lambda Args Expr
55 | Call Expr [Expr]
61 | Call Expr [Expr]
56 | If [(Expr, Expr)] Expr
62 | If [(Expr, Expr)] Expr
57− | Let [Graph.SCC Def] Expr
64+ | LetRec [Def] Expr
65+ | LetDestruct Match Expr Expr
58− | Case Expr [(Ptrn.Canonical, Expr)]
66+ | Case Expr [(Match, Expr)]
59 | CtorAccess Expr Int
67 | CtorAccess Expr Int
60 | Accessor Name
68 | Accessor Name
61 | Access Expr Name
69 | Access Expr Name
62− | Update Expr [(Name, Expr)]
70+ | Update Expr (Map.Map Name Expr)
63− | Record [(Name, Expr)]
71+ | Record (Map.Map Name Expr)
65− | Tuple Expr Expr [Expr]
73+ | Tuple Expr Expr (Maybe Expr)
66 | GLShader Name Name Literal.Shader
74 | GLShader Name Name Literal.Shader
@@ -72,21 +80,54 @@ data Expr_
75− { _let_name :: Text
83+ { _def_name :: A.Located N.Name
76− , _let_args :: [A.Located Ptrn.Canonical]
84+ , _def_args :: Args
77− , _let_body :: Expr
85+ , _def_body :: Expr
78− , _let_type :: Maybe (A.Located Type.Canonical)
86+ , _def_type :: Maybe (A.Located Type.Canonical)
94+data Args = Args [Arg] Destructors
95+data Arg = Arg Int Pattern
97+data Match = Match Pattern Destructors
100+type Pattern = A.Located Pattern_
106+ | PAlias Pattern N.Name
108+ | PTuple Pattern Pattern (Maybe Pattern)
109+ | PCtor ModuleName.Canonical N.Name [Pattern]
111+ | PCons Pattern Pattern
112+ | PLiteral Literal.Literal
115+type Destructors = Map.Map N.Name (A.Located Destructor)
118+ = DIndex Int Destructor
119+ | DField N.Name Destructor
83-- DECLARATIONS
124-- DECLARATIONS
86data Decl =
127data Decl =
88− { _top_name :: Text
129+ { _top_name :: N.Name
89− , _top_args :: [A.Located Ptrn.Canonical]
130+ , _top_args :: Args
90 , _top_body :: Expr
131 , _top_body :: Expr
91 , _top_type :: Maybe (A.Located Type.Canonical)
132 , _top_type :: Maybe (A.Located Type.Canonical)
92 , _top_deps :: [Var.Global]
133 , _top_deps :: [Var.Global]