on 5c849ca help sign in
elk/compiler/src/AST/Source.hs
220 lines 3.7 kB history raw
1{-# OPTIONS_GHC -Wall #-}
2{-# LANGUAGE OverloadedStrings #-}
3module AST.Source
4 ( Expr, Expr_(..), VarType(..)
5 , Def(..)
6 , Pattern, Pattern_(..)
7 , Type, Type_(..)
8 , Module(..)
9 , getName
10 , getImportName
11 , Import(..)
12 , Value(..)
13 , Union(..)
14 , Alias(..)
15 , Infix(..)
16 , Port(..)
17 , Effects(..)
18 , Manager(..)
19 , Docs(..)
20 , Comment(..)
21 , Exposing(..)
22 , Exposed(..)
23 , Privacy(..)
24 )
25 where
28import Data.Name (Name)
29import qualified Data.Utf8 as Utf8
30import Data.Word (Word8)
31import Foreign.Ptr (Ptr)
33import qualified AST.Utils.Binop as Binop
34import qualified AST.Utils.Shader as Shader
35import qualified Reporting.Annotation as A
39-- EXPRESSIONS
42type Expr = A.Located Expr_
45data Expr_
46 = Chr Utf8.String
47 | Str Utf8.String
48 | Int Int
49 | Float (Utf8.Under256 Float)
50 | Var VarType Name
51 | VarQual VarType Name Name
52 | List [Expr]
53 | Op Name
54 | Negate Expr
55 | Binops [(Expr, A.Located Name)] Expr
56 | Lambda [Pattern] Expr
57 | Call Expr [Expr]
58 | If [(Expr, Expr)] Expr
59 | Let [A.Located Def] Expr
60 | Case Expr [(Pattern, Expr)]
61 | Accessor Name
62 | Access Expr (A.Located Name)
63 | Update (A.Located Name) [(A.Located Name, Expr)]
64 | Record [(A.Located Name, Expr)]
65 | Unit
66 | Tuple Expr Expr [Expr]
67 | Shader Shader.Source Shader.Types
70data VarType = LowVar | CapVar
74-- DEFINITIONS
77data Def
78 = Define (A.Located Name) [Pattern] Expr (Maybe Type)
79 | Destruct Pattern Expr
83-- PATTERN
86type Pattern = A.Located Pattern_
89data Pattern_
90 = PAnything
91 | PVar Name
92 | PRecord [A.Located Name]
93 | PAlias Pattern (A.Located Name)
94 | PUnit
95 | PTuple Pattern Pattern [Pattern]
96 | PCtor A.Region Name [Pattern]
97 | PCtorQual A.Region Name Name [Pattern]
98 | PList [Pattern]
99 | PCons Pattern Pattern
100 | PChr Utf8.String
101 | PStr Utf8.String
102 | PInt Int
106-- TYPE
109type Type =
110 A.Located Type_
113data Type_
114 = TLambda Type Type
115 | TVar Name
116 | TType A.Region Name [Type]
117 | TTypeQual A.Region Name Name [Type]
118 | TRecord [(A.Located Name, Type)] (Maybe (A.Located Name))
119 | TUnit
120 | TTuple Type Type [Type]
124-- MODULE
127data Module =
128 Module
129 { _name :: Maybe (A.Located Name)
130 , _exports :: A.Located Exposing
131 , _docs :: Maybe Docs
132 , _imports :: [Import]
133 , _values :: [A.Located Value]
134 , _unions :: [A.Located Union]
135 , _aliases :: [A.Located Alias]
136 , _binops :: [A.Located Infix]
137 , _effects :: Effects
138 }
141getName :: Module -> Name
142getName (Module maybeName _ _ _ _ _ _ _ _) =
143 case maybeName of
144 Just (A.At _ name) ->
145 name
147 Nothing ->
148 defaultModuleName
151{-# NOINLINE defaultModuleName #-}
152defaultModuleName :: Name
153defaultModuleName =
154 "Main"
157getImportName :: Import -> Name
158getImportName (Import (A.At _ name) _ _) =
159 name
162data Import =
163 Import
164 { _import :: A.Located Name
165 , _alias :: Maybe Name
166 , _exposing :: Exposing
167 }
170data Value = Value (A.Located Name) [Pattern] Expr (Maybe Type)
171data Union = Union (A.Located Name) [A.Located Name] [(A.Located Name, [Type])]
172data Alias = Alias (A.Located Name) [A.Located Name] Type
173data Infix = Infix Name Binop.Associativity Binop.Precedence Name
174data Port = Port (A.Located Name) Type
177data Effects
178 = NoEffects
179 | Ports [Port]
180 | Manager A.Region Manager
183data Manager
184 = Cmd (A.Located Name)
185 | Sub (A.Located Name)
186 | Fx (A.Located Name) (A.Located Name)
189data Docs =
190 Docs
191 { _overview :: Comment
192 , _comments :: [(Name, Comment)]
193 }
196data Comment =
197 Comment
198 { _start :: Ptr Word8
199 , _end :: Ptr Word8
200 }
204-- EXPOSING
207data Exposing
208 = Open
209 | Explicit [A.Located Exposed]
212data Exposed
213 = Lower Name
214 | Upper Name Privacy
215 | Operator Name
218data Privacy
219 = Public
220 | Private