-
Notifications
You must be signed in to change notification settings - Fork 657
/
Source.hs
209 lines (147 loc) · 3.52 KB
/
Source.hs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
{-# OPTIONS_GHC -Wall #-}
module AST.Source
( Expr, Expr_(..), VarType(..)
, Def(..)
, Pattern, Pattern_(..)
, Type, Type_(..)
, Module(..)
, getName
, getImportName
, Import(..)
, Value(..)
, Union(..)
, Alias(..)
, Infix(..)
, Port(..)
, Effects(..)
, Manager(..)
, Docs(..)
, Comment(..)
, Exposing(..)
, Exposed(..)
, Privacy(..)
)
where
import Data.Name (Name)
import qualified Data.Name as Name
import qualified AST.Utils.Binop as Binop
import qualified AST.Utils.Shader as Shader
import qualified Elm.Float as EF
import qualified Elm.String as ES
import qualified Parse.Primitives as P
import qualified Reporting.Annotation as A
-- EXPRESSIONS
type Expr = A.Located Expr_
data Expr_
= Chr ES.String
| Str ES.String
| Int Int
| Float EF.Float
| Var VarType Name
| VarQual VarType Name Name
| List [Expr]
| Op Name
| Negate Expr
| Binops [(Expr, A.Located Name)] Expr
| Lambda [Pattern] Expr
| Call Expr [Expr]
| If [(Expr, Expr)] Expr
| Let [A.Located Def] Expr
| Case Expr [(Pattern, Expr)]
| Accessor Name
| Access Expr (A.Located Name)
| Update (A.Located Name) [(A.Located Name, Expr)]
| Record [(A.Located Name, Expr)]
| Unit
| Tuple Expr Expr [Expr]
| Shader Shader.Source Shader.Types
data VarType = LowVar | CapVar
-- DEFINITIONS
data Def
= Define (A.Located Name) [Pattern] Expr (Maybe Type)
| Destruct Pattern Expr
-- PATTERN
type Pattern = A.Located Pattern_
data Pattern_
= PAnything
| PVar Name
| PRecord [A.Located Name]
| PAlias Pattern (A.Located Name)
| PUnit
| PTuple Pattern Pattern [Pattern]
| PCtor A.Region Name [Pattern]
| PCtorQual A.Region Name Name [Pattern]
| PList [Pattern]
| PCons Pattern Pattern
| PChr ES.String
| PStr ES.String
| PInt Int
-- TYPE
type Type =
A.Located Type_
data Type_
= TLambda Type Type
| TVar Name
| TType A.Region Name [Type]
| TTypeQual A.Region Name Name [Type]
| TRecord [(A.Located Name, Type)] (Maybe (A.Located Name))
| TUnit
| TTuple Type Type [Type]
-- MODULE
data Module =
Module
{ _name :: Maybe (A.Located Name)
, _exports :: A.Located Exposing
, _docs :: Docs
, _imports :: [Import]
, _values :: [A.Located Value]
, _unions :: [A.Located Union]
, _aliases :: [A.Located Alias]
, _binops :: [A.Located Infix]
, _effects :: Effects
}
getName :: Module -> Name
getName (Module maybeName _ _ _ _ _ _ _ _) =
case maybeName of
Just (A.At _ name) ->
name
Nothing ->
Name._Main
getImportName :: Import -> Name
getImportName (Import (A.At _ name) _ _) =
name
data Import =
Import
{ _import :: A.Located Name
, _alias :: Maybe Name
, _exposing :: Exposing
}
data Value = Value (A.Located Name) [Pattern] Expr (Maybe Type)
data Union = Union (A.Located Name) [A.Located Name] [(A.Located Name, [Type])]
data Alias = Alias (A.Located Name) [A.Located Name] Type
data Infix = Infix Name Binop.Associativity Binop.Precedence Name
data Port = Port (A.Located Name) Type
data Effects
= NoEffects
| Ports [Port]
| Manager A.Region Manager
data Manager
= Cmd (A.Located Name)
| Sub (A.Located Name)
| Fx (A.Located Name) (A.Located Name)
data Docs
= NoDocs A.Region
| YesDocs Comment [(Name, Comment)]
newtype Comment =
Comment P.Snippet
-- EXPOSING
data Exposing
= Open
| Explicit [Exposed]
data Exposed
= Lower (A.Located Name)
| Upper (A.Located Name) Privacy
| Operator A.Region Name
data Privacy
= Public A.Region
| Private