on 087045f help sign in
elk/src/AST/Expression/Source.hs
151 lines 2.7 kB history raw
1{-# OPTIONS_GHC -Wall #-}
2{-# LANGUAGE OverloadedStrings #-}
3module AST.Expression.Source
4 ( Expr, Expr_(..)
5 , Decl, Decl_(..)
6 , Def(..)
7 , Module(..)
8 , Import(..)
9 , Effects(..)
10 , Manager(..)
11 , defaultModule
12 , Exposing(..)
13 , Exposed(..)
14 , Privacy(..)
15 )
16 where
19import qualified Data.ByteString as B
20import Data.Text (Text)
22import qualified AST.Binop as Binop
23import qualified AST.Literal as Literal
24import qualified AST.Pattern as Ptrn
25import qualified AST.Type as Type
26import qualified Elm.Name as N
27import qualified Reporting.Annotation as A
28import qualified Reporting.Region as R
32-- EXPRESSIONS
35type Expr = A.Located Expr_
38data Expr_
39 = Literal Literal.Literal
40 | Var (Maybe N.Name) N.Name
41 | List [Expr]
42 | Op N.Name
43 | Negate Expr
44 | Binops [(Expr, A.Located N.Name)] Expr
45 | Lambda Ptrn.Raw Expr
46 | Call Expr [Expr]
47 | If [(Expr, Expr)] Expr
48 | Let [A.Located Def] Expr
49 | Case Expr [(Ptrn.Raw, Expr)]
50 | Accessor N.Name
51 | Access Expr N.Name
52 | Update (A.Located N.Name) [(A.Located N.Name, Expr)]
53 | Record [(A.Located N.Name, Expr)]
54 | Unit
55 | Tuple Expr Expr [Expr]
56 | GLShader Text Text Literal.Shader
60-- DEFINITIONS
63data Def
64 = Annotate Text Type.Raw
65 | Define Text [Ptrn.Raw] Expr
66 | Destruct Ptrn.Raw Expr
70-- DECLARATIONS
73type Decl = A.Located Decl_
76data Decl_
77 = Union (A.Located N.Name) [A.Located N.Name] [(A.Located Text, [Type.Raw])]
78 | Alias (A.Located N.Name) [A.Located N.Name] Type.Raw
79 | Binop (A.Located N.Name) Binop.Associativity Binop.Precedence N.Name
80 | Port (A.Located N.Name) Type.Raw
81 | Docs Text
82 | Annotation (A.Located N.Name) Type.Raw
83 | Definition (A.Located N.Name) [Ptrn.Raw] Expr
87-- MODULE
90data Module decls =
91 Module
92 { _name :: N.Name
93 , _effects :: Effects
94 , _docs :: A.Located (Maybe B.ByteString)
95 , _exports :: Exposing
96 , _imports :: [Import]
97 , _decls :: decls
98 }
101data Import =
102 Import
103 { _import :: A.Located N.Name
104 , _alias :: Maybe N.Name
105 , _exposing :: Exposing
106 }
109data Effects
110 = NoEffects
111 | Ports R.Region
112 | Effects R.Region Manager
115data Manager
116 = Cmd (A.Located N.Name)
117 | Sub (A.Located N.Name)
118 | Fx (A.Located N.Name) (A.Located N.Name)
121defaultModule :: [Import] -> decls -> Module decls
122defaultModule imports decls =
123 let zero = R.Position 1 1 in
124 Module
125 { _name = "Main"
126 , _effects = NoEffects
127 , _docs = A.at zero zero Nothing
128 , _exports = Open
129 , _imports = imports
130 , _decls = decls
131 }
135-- EXPOSING
138data Exposing
139 = Open
140 | Explicit ![A.Located Exposed]
143data Exposed
144 = Lower !Text
145 | Upper !Text !Privacy
146 | Operator !Text
149data Privacy
150 = Public
151 | Private