@@ -1,27 +1,35 @@
11{-# OPTIONS_GHC -Wall #-}
22{-# LANGUAGE OverloadedStrings #-}
33module AST.Expression.Canonical
4− ( Expr, Expr'(..)
5− , Main(..)
4+ ( Expr
5+ , Expr_(..)
66 , Def(..)
7− , SortedDefs(..), toSortedDefs
8− , localVar
9− , collectApps, collectFields, collectLambdas
7+ , Decl(..)
8+ , Module(..)
9+ , Alias(..)
10+ , Union(..)
11+ , Binop(..)
12+ , Effects(..)
13+ , Port(..)
14+ , Docs(..)
1015 )
1116 where
1217
1318
14−import Data.Monoid ((<>))
19+import Control.Monad (liftM2, liftM3)
20+import Data.Binary
21+import qualified Data.Graph as Graph
22+import qualified Data.Map as Map
1523import Data.Text (Text)
16−import qualified Data.Text.Lazy as LText
17−import qualified Data.Text.Lazy.Builder as B
1824
19−import qualified AST.Effects as Effects
25+import qualified AST.Binop as Binop
2026import qualified AST.Literal as Literal
2127import qualified AST.Module.Name as ModuleName
2228import qualified AST.Pattern as Ptrn
2329import qualified AST.Type as Type
2430import qualified AST.Variable as Var
31+import qualified Elm.Name as N
32+import Elm.Name (Name)
2533import qualified Reporting.Annotation as A
2634import qualified Reporting.Region as R
2735
@@ -31,36 +39,31 @@ import qualified Reporting.Region as R
3139
3240
3341type Expr =
34− A.Annotated R.Region Expr'
35−
36−
37−data Expr'
38− = Literal Literal.Literal
39− | Var Var.Canonical
40− | List [Expr]
41− | Binop Var.Canonical Expr Expr
42− | Lambda Ptrn.Canonical Expr
43− | App Expr Expr
44− | If [(Expr, Expr)] Expr
45− | Let [Def] Expr
46− | Case Expr [(Ptrn.Canonical, Expr)]
47− | Ctor Var.Canonical [Expr]
48− | Access Expr Text
49− | Update Expr [(Text, Expr)]
50− | Record [(Text, Expr)]
51− -- for type checking and code gen only
52− | Cmd ModuleName.Canonical Effects.ManagerType
53− | Sub ModuleName.Canonical Effects.ManagerType
54− | OutgoingPort Text Type.Canonical
55− | IncomingPort Text Type.Canonical
56− | Program Main Expr
57− | SaveEnv ModuleName.Canonical Effects.Canonical
58− | GLShader Text Text Literal.Shader
59−
60−
61−data Main
62− = Static
63− | Dynamic Type.Canonical
42+ A.Annotated R.Region Expr_
43+
44+
45+data Expr_
46+ = VarLocal Name
47+ | VarTopLevel ModuleName.Canonical Name
48+ | VarKernel Name Name
49+ | VarForeign ModuleName.Canonical Name
50+ | VarOperator ModuleName.Canonical Name Name
51+ | Literal Literal.Literal
52+ | List [Expr]
53+ | Binop Name ModuleName.Canonical Name Expr Expr
54+ | Lambda Ptrn.Canonical Expr
55+ | Call Expr [Expr]
56+ | If [(Expr, Expr)] Expr
57+ | Let [Graph.SCC Def] Expr
58+ | Case Expr [(Ptrn.Canonical, Expr)]
59+ | CtorAccess Expr Int
60+ | Accessor Name
61+ | Access Expr Name
62+ | Update Expr [(Name, Expr)]
63+ | Record [(Name, Expr)]
64+ | Unit
65+ | Tuple Expr Expr [Expr]
66+ | GLShader Name Name Literal.Shader
6467
6568
6669
@@ -69,93 +72,84 @@ data Main
6972
7073data Def =
7174 Def
72− { _region :: R.Region
73− , _pattern :: Ptrn.Canonical
74− , _body :: Expr
75− , _type :: Maybe (A.Located Type.Canonical)
75+ { _let_name :: Text
76+ , _let_args :: [A.Located Ptrn.Canonical]
77+ , _let_body :: Expr
78+ , _let_type :: Maybe (A.Located Type.Canonical)
7679 }
7780
7881
7982
80−-- SORTED DEFS
83+-- DECLARATIONS
8184
8285
83−data SortedDefs
84− = NoMain [Def]
85− | YesMain [Def] Def [Def]
86−
87−
88−toSortedDefs :: Expr -> SortedDefs
89−toSortedDefs (A.A _ expr) =
90− case expr of
91− Let defs body ->
92− foldr defCons (toSortedDefs body) defs
86+data Decl =
87+ Decl
88+ { _top_name :: Text
89+ , _top_args :: [A.Located Ptrn.Canonical]
90+ , _top_body :: Expr
91+ , _top_type :: Maybe (A.Located Type.Canonical)
92+ , _top_deps :: [Var.Global]
93+ }
9394
94− _ ->
95− NoMain []
9695
9796
98−defCons :: Def -> SortedDefs -> SortedDefs
99−defCons def@(Def _ (A.A _ pattern) _ _) sortedDefs =
100− case (pattern, sortedDefs) of
101− (Ptrn.Var "main", NoMain defs) ->
102− YesMain [] def defs
97+-- MODULES
10398
104− (_, NoMain defs) ->
105− NoMain (def : defs)
10699
107− (_, YesMain defs main rest) ->
108− YesMain (def : defs) main rest
100+data Module phase =
101+ Module
102+ { _name :: ModuleName.Canonical
103+ , _docs :: A.Located (Maybe Docs)
104+ , _imports :: [N.Name]
105+ , _decls :: [Graph.SCC Decl]
106+ , _unions :: Map.Map N.Name Union
107+ , _aliases :: Map.Map N.Name Alias
108+ , _binops :: Map.Map N.Name Binop
109+ , _effects :: Effects
110+ }
109111
110112
113+data Alias = Alias [N.Name] Type.Canonical
114+data Union = Union [N.Name] [(N.Name, [Type.Canonical])]
115+data Binop = Binop_ Binop.Associativity Binop.Precedence N.Name
111116
112−-- HELPERS
117+data Effects
118+ = NoEffects
119+ | Ports [Port]
120+ | Cmd
121+ | Sub
122+ | Fx
113123
114124
115−localVar :: Text -> Expr'
116−localVar x =
117− Var (Var.Canonical Var.Local x)
125+data Port = Port R.Region N.Name Type.Canonical
118126
119127
120−-- COLLECTORS
121128
129+-- DOCS
122130
123−collectApps :: Expr -> [Expr]
124−collectApps annExpr@(A.A _ expr) =
125− case expr of
126− App a b ->
127− collectApps a ++ [b]
128131
129− _ ->
130− [annExpr]
132+data Docs =
133+ Docs
134+ { _overview :: Text
135+ , _comments :: Map.Map N.Name Text
136+ }
131137
132138
133−collectFields :: Expr -> Maybe Text
134−collectFields expr =
135− fmap (LText.toStrict . B.toLazyText) (collectFieldsHelp expr mempty)
136139
140+-- BINARY
137141
138−collectFieldsHelp :: Expr -> B.Builder -> Maybe B.Builder
139−collectFieldsHelp (A.A _ expr) builder =
140− case expr of
141− Var var ->
142− Just (B.fromText (Var.toText var) <> builder)
143142
144− Access record field ->
145− collectFieldsHelp record ("." <> B.fromText field <> builder)
143+instance Binary Alias where
144+ get = liftM2 Alias get get
145+ put (Alias a b) = put a >> put b
146146
147− _ ->
148− Nothing
149147
148+instance Binary Union where
149+ get = liftM2 Union get get
150+ put (Union a b) = put a >> put b
150151
151−collectLambdas :: Expr -> ([Ptrn.Canonical], Expr)
152−collectLambdas lexpr@(A.A _ expr) =
153− case expr of
154− Lambda pattern body ->
155− let
156− (ps, body') = collectLambdas body
157− in
158− (pattern : ps, body')
159152
160− _ ->
161− ([], lexpr)
153+instance Binary Binop where
154+ get = liftM3 Binop_ get get get
155+ put (Binop_ a b c) = put a >> put b >> put c