1-- | This module contains data types for the entire PureScript surface language. Every
2-- token is represented in the tree, and every token is annotated with
3-- whitespace and comments (both leading and trailing). This means one can write
4-- an exact printer so that `print . parse = id`. Every constructor is laid out
5-- with tokens in left-to-right order. The core productions are given a slot for
6-- arbitrary annotations, however this is not used by the parser.
7
8module Language.PureScript.CST.Types where
9
10import Prelude
11
12import Data.List.NonEmpty (NonEmpty)
13import Data.Text (Text)
14import Data.Void (Void)
15import GHC.Generics (Generic)
16import qualified Language.PureScript.Names as N
17import qualified Language.PureScript.Roles as R
18import Language.PureScript.PSString (PSString)
19
20data SourcePos = SourcePos
21  { srcLine :: {-# UNPACK #-} !Int
22  , srcColumn :: {-# UNPACK #-} !Int
23  } deriving (Show, Eq, Ord, Generic)
24
25data SourceRange = SourceRange
26  { srcStart :: !SourcePos
27  , srcEnd :: !SourcePos
28  } deriving (Show, Eq, Ord, Generic)
29
30data Comment l
31  = Comment !Text
32  | Space {-# UNPACK #-} !Int
33  | Line !l
34  deriving (Show, Eq, Ord, Generic, Functor)
35
36data LineFeed = LF | CRLF
37  deriving (Show, Eq, Ord, Generic)
38
39data TokenAnn = TokenAnn
40  { tokRange :: !SourceRange
41  , tokLeadingComments :: ![Comment LineFeed]
42  , tokTrailingComments :: ![Comment Void]
43  } deriving (Show, Eq, Ord, Generic)
44
45data SourceStyle = ASCII | Unicode
46  deriving (Show, Eq, Ord, Generic)
47
48data Token
49  = TokLeftParen
50  | TokRightParen
51  | TokLeftBrace
52  | TokRightBrace
53  | TokLeftSquare
54  | TokRightSquare
55  | TokLeftArrow !SourceStyle
56  | TokRightArrow !SourceStyle
57  | TokRightFatArrow !SourceStyle
58  | TokDoubleColon !SourceStyle
59  | TokForall !SourceStyle
60  | TokEquals
61  | TokPipe
62  | TokTick
63  | TokDot
64  | TokComma
65  | TokUnderscore
66  | TokBackslash
67  | TokLowerName ![Text] !Text
68  | TokUpperName ![Text] !Text
69  | TokOperator ![Text] !Text
70  | TokSymbolName ![Text] !Text
71  | TokSymbolArr !SourceStyle
72  | TokHole !Text
73  | TokChar !Text !Char
74  | TokString !Text !PSString
75  | TokRawString !Text
76  | TokInt !Text !Integer
77  | TokNumber !Text !Double
78  | TokLayoutStart
79  | TokLayoutSep
80  | TokLayoutEnd
81  | TokEof
82  deriving (Show, Eq, Ord, Generic)
83
84data SourceToken = SourceToken
85  { tokAnn :: !TokenAnn
86  , tokValue :: !Token
87  } deriving (Show, Eq, Ord, Generic)
88
89data Ident = Ident
90  { getIdent :: Text
91  } deriving (Show, Eq, Ord, Generic)
92
93data Name a = Name
94  { nameTok :: SourceToken
95  , nameValue :: a
96  } deriving (Show, Eq, Ord, Functor, Foldable, Traversable, Generic)
97
98data QualifiedName a = QualifiedName
99  { qualTok :: SourceToken
100  , qualModule :: Maybe N.ModuleName
101  , qualName :: a
102  } deriving (Show, Eq, Ord, Functor, Foldable, Traversable, Generic)
103
104data Label = Label
105  { lblTok :: SourceToken
106  , lblName :: PSString
107  } deriving (Show, Eq, Ord, Generic)
108
109data Wrapped a = Wrapped
110  { wrpOpen :: SourceToken
111  , wrpValue :: a
112  , wrpClose :: SourceToken
113  } deriving (Show, Eq, Ord, Functor, Foldable, Traversable, Generic)
114
115data Separated a = Separated
116  { sepHead :: a
117  , sepTail :: [(SourceToken, a)]
118  } deriving (Show, Eq, Ord, Functor, Foldable, Traversable, Generic)
119
120data Labeled a b = Labeled
121  { lblLabel :: a
122  , lblSep :: SourceToken
123  , lblValue  :: b
124  } deriving (Show, Eq, Ord, Functor, Foldable, Traversable, Generic)
125
126type Delimited a = Wrapped (Maybe (Separated a))
127type DelimitedNonEmpty a = Wrapped (Separated a)
128
129data OneOrDelimited a
130  = One a
131  | Many (DelimitedNonEmpty a)
132  deriving (Show, Eq, Ord, Functor, Foldable, Traversable, Generic)
133
134data Type a
135  = TypeVar a (Name Ident)
136  | TypeConstructor a (QualifiedName (N.ProperName 'N.TypeName))
137  | TypeWildcard a SourceToken
138  | TypeHole a (Name Ident)
139  | TypeString a SourceToken PSString
140  | TypeRow a (Wrapped (Row a))
141  | TypeRecord a (Wrapped (Row a))
142  | TypeForall a SourceToken (NonEmpty (TypeVarBinding a)) SourceToken (Type a)
143  | TypeKinded a (Type a) SourceToken (Type a)
144  | TypeApp a (Type a) (Type a)
145  | TypeOp a (Type a) (QualifiedName (N.OpName 'N.TypeOpName)) (Type a)
146  | TypeOpName a (QualifiedName (N.OpName 'N.TypeOpName))
147  | TypeArr a (Type a) SourceToken (Type a)
148  | TypeArrName a SourceToken
149  | TypeConstrained a (Constraint a) SourceToken (Type a)
150  | TypeParens a (Wrapped (Type a))
151  | TypeUnaryRow a SourceToken (Type a)
152  deriving (Show, Eq, Ord, Functor, Foldable, Traversable, Generic)
153
154data TypeVarBinding a
155  = TypeVarKinded (Wrapped (Labeled (Name Ident) (Type a)))
156  | TypeVarName (Name Ident)
157  deriving (Show, Eq, Ord, Functor, Foldable, Traversable, Generic)
158
159data Constraint a
160  = Constraint a (QualifiedName (N.ProperName 'N.ClassName)) [Type a]
161  | ConstraintParens a (Wrapped (Constraint a))
162  deriving (Show, Eq, Ord, Functor, Foldable, Traversable, Generic)
163
164data Row a = Row
165  { rowLabels :: Maybe (Separated (Labeled Label (Type a)))
166  , rowTail :: Maybe (SourceToken, Type a)
167  } deriving (Show, Eq, Ord, Functor, Foldable, Traversable, Generic)
168
169data Module a = Module
170  { modAnn :: a
171  , modKeyword :: SourceToken
172  , modNamespace :: Name N.ModuleName
173  , modExports :: Maybe (DelimitedNonEmpty (Export a))
174  , modWhere :: SourceToken
175  , modImports :: [ImportDecl a]
176  , modDecls :: [Declaration a]
177  , modTrailingComments :: [Comment LineFeed]
178  } deriving (Show, Eq, Ord, Functor, Foldable, Traversable, Generic)
179
180data Export a
181  = ExportValue a (Name Ident)
182  | ExportOp a (Name (N.OpName 'N.ValueOpName))
183  | ExportType a (Name (N.ProperName 'N.TypeName)) (Maybe (DataMembers a))
184  | ExportTypeOp a SourceToken (Name (N.OpName 'N.TypeOpName))
185  | ExportClass a SourceToken (Name (N.ProperName 'N.ClassName))
186  | ExportKind a SourceToken (Name (N.ProperName 'N.TypeName))
187  | ExportModule a SourceToken (Name N.ModuleName)
188  deriving (Show, Eq, Ord, Functor, Foldable, Traversable, Generic)
189
190data DataMembers a
191  = DataAll a SourceToken
192  | DataEnumerated a (Delimited (Name (N.ProperName 'N.ConstructorName)))
193  deriving (Show, Eq, Ord, Functor, Foldable, Traversable, Generic)
194
195data Declaration a
196  = DeclData a (DataHead a) (Maybe (SourceToken, Separated (DataCtor a)))
197  | DeclType a (DataHead a) SourceToken (Type a)
198  | DeclNewtype a (DataHead a) SourceToken (Name (N.ProperName 'N.ConstructorName)) (Type a)
199  | DeclClass a (ClassHead a) (Maybe (SourceToken, NonEmpty (Labeled (Name Ident) (Type a))))
200  | DeclInstanceChain a (Separated (Instance a))
201  | DeclDerive a SourceToken (Maybe SourceToken) (InstanceHead a)
202  | DeclKindSignature a SourceToken (Labeled (Name (N.ProperName 'N.TypeName)) (Type a))
203  | DeclSignature a (Labeled (Name Ident) (Type a))
204  | DeclValue a (ValueBindingFields a)
205  | DeclFixity a FixityFields
206  | DeclForeign a SourceToken SourceToken (Foreign a)
207  | DeclRole a SourceToken SourceToken (Name (N.ProperName 'N.TypeName)) (NonEmpty Role)
208  deriving (Show, Eq, Ord, Functor, Foldable, Traversable, Generic)
209
210data Instance a = Instance
211  { instHead :: InstanceHead a
212  , instBody :: Maybe (SourceToken, NonEmpty (InstanceBinding a))
213  } deriving (Show, Eq, Ord, Functor, Foldable, Traversable, Generic)
214
215data InstanceBinding a
216  = InstanceBindingSignature a (Labeled (Name Ident) (Type a))
217  | InstanceBindingName a (ValueBindingFields a)
218  deriving (Show, Eq, Ord, Functor, Foldable, Traversable, Generic)
219
220data ImportDecl a = ImportDecl
221  { impAnn :: a
222  , impKeyword :: SourceToken
223  , impModule :: Name N.ModuleName
224  , impNames :: Maybe (Maybe SourceToken, DelimitedNonEmpty (Import a))
225  , impQual :: Maybe (SourceToken, Name N.ModuleName)
226  } deriving (Show, Eq, Ord, Functor, Foldable, Traversable, Generic)
227
228data Import a
229  = ImportValue a (Name Ident)
230  | ImportOp a (Name (N.OpName 'N.ValueOpName))
231  | ImportType a (Name (N.ProperName 'N.TypeName)) (Maybe (DataMembers a))
232  | ImportTypeOp a SourceToken (Name (N.OpName 'N.TypeOpName))
233  | ImportClass a SourceToken (Name (N.ProperName 'N.ClassName))
234  | ImportKind a SourceToken (Name (N.ProperName 'N.TypeName))
235  deriving (Show, Eq, Ord, Functor, Foldable, Traversable, Generic)
236
237data DataHead a = DataHead
238  { dataHdKeyword :: SourceToken
239  , dataHdName :: Name (N.ProperName 'N.TypeName)
240  , dataHdVars :: [TypeVarBinding a]
241  } deriving (Show, Eq, Ord, Functor, Foldable, Traversable, Generic)
242
243data DataCtor a = DataCtor
244  { dataCtorAnn :: a
245  , dataCtorName :: Name (N.ProperName 'N.ConstructorName)
246  , dataCtorFields :: [Type a]
247  } deriving (Show, Eq, Ord, Functor, Foldable, Traversable, Generic)
248
249data ClassHead a = ClassHead
250  { clsKeyword :: SourceToken
251  , clsSuper :: Maybe (OneOrDelimited (Constraint a), SourceToken)
252  , clsName :: Name (N.ProperName 'N.ClassName)
253  , clsVars :: [TypeVarBinding a]
254  , clsFundeps :: Maybe (SourceToken, Separated ClassFundep)
255  } deriving (Show, Eq, Ord, Functor, Foldable, Traversable, Generic)
256
257data ClassFundep
258  = FundepDetermined SourceToken (NonEmpty (Name Ident))
259  | FundepDetermines (NonEmpty (Name Ident)) SourceToken (NonEmpty (Name Ident))
260  deriving (Show, Eq, Ord, Generic)
261
262data InstanceHead a = InstanceHead
263  { instKeyword :: SourceToken
264  , instNameSep :: Maybe (Name Ident, SourceToken)
265  , instConstraints :: Maybe (OneOrDelimited (Constraint a), SourceToken)
266  , instClass :: QualifiedName (N.ProperName 'N.ClassName)
267  , instTypes :: [Type a]
268  } deriving (Show, Eq, Ord, Functor, Foldable, Traversable, Generic)
269
270data Fixity
271  = Infix
272  | Infixl
273  | Infixr
274  deriving (Show, Eq, Ord, Generic)
275
276data FixityOp
277  = FixityValue (QualifiedName (Either Ident (N.ProperName 'N.ConstructorName))) SourceToken (Name (N.OpName 'N.ValueOpName))
278  | FixityType SourceToken (QualifiedName (N.ProperName 'N.TypeName)) SourceToken (Name (N.OpName 'N.TypeOpName))
279  deriving (Show, Eq, Ord, Generic)
280
281data FixityFields = FixityFields
282  { fxtKeyword :: (SourceToken, Fixity)
283  , fxtPrec :: (SourceToken, Integer)
284  , fxtOp :: FixityOp
285  } deriving (Show, Eq, Ord, Generic)
286
287data ValueBindingFields a = ValueBindingFields
288  { valName :: Name Ident
289  , valBinders :: [Binder a]
290  , valGuarded :: Guarded a
291  } deriving (Show, Eq, Ord, Functor, Foldable, Traversable, Generic)
292
293data Guarded a
294  = Unconditional SourceToken (Where a)
295  | Guarded (NonEmpty (GuardedExpr a))
296  deriving (Show, Eq, Ord, Functor, Foldable, Traversable, Generic)
297
298data GuardedExpr a = GuardedExpr
299  { grdBar :: SourceToken
300  , grdPatterns :: Separated (PatternGuard a)
301  , grdSep :: SourceToken
302  , grdWhere :: Where a
303  } deriving (Show, Eq, Ord, Functor, Foldable, Traversable, Generic)
304
305data PatternGuard a = PatternGuard
306  { patBinder :: Maybe (Binder a, SourceToken)
307  , patExpr :: Expr a
308  } deriving (Show, Eq, Ord, Functor, Foldable, Traversable, Generic)
309
310data Foreign a
311  = ForeignValue (Labeled (Name Ident) (Type a))
312  | ForeignData SourceToken (Labeled (Name (N.ProperName 'N.TypeName)) (Type a))
313  | ForeignKind SourceToken (Name (N.ProperName 'N.TypeName))
314  deriving (Show, Eq, Ord, Functor, Foldable, Traversable, Generic)
315
316data Role = Role
317  { roleTok :: SourceToken
318  , roleValue :: R.Role
319  } deriving (Show, Eq, Ord, Generic)
320
321data Expr a
322  = ExprHole a (Name Ident)
323  | ExprSection a SourceToken
324  | ExprIdent a (QualifiedName Ident)
325  | ExprConstructor a (QualifiedName (N.ProperName 'N.ConstructorName))
326  | ExprBoolean a SourceToken Bool
327  | ExprChar a SourceToken Char
328  | ExprString a SourceToken PSString
329  | ExprNumber a SourceToken (Either Integer Double)
330  | ExprArray a (Delimited (Expr a))
331  | ExprRecord a (Delimited (RecordLabeled (Expr a)))
332  | ExprParens a (Wrapped (Expr a))
333  | ExprTyped a (Expr a) SourceToken (Type a)
334  | ExprInfix a (Expr a) (Wrapped (Expr a)) (Expr a)
335  | ExprOp a (Expr a) (QualifiedName (N.OpName 'N.ValueOpName)) (Expr a)
336  | ExprOpName a (QualifiedName (N.OpName 'N.ValueOpName))
337  | ExprNegate a SourceToken (Expr a)
338  | ExprRecordAccessor a (RecordAccessor a)
339  | ExprRecordUpdate a (Expr a) (DelimitedNonEmpty (RecordUpdate a))
340  | ExprApp a (Expr a) (Expr a)
341  | ExprLambda a (Lambda a)
342  | ExprIf a (IfThenElse a)
343  | ExprCase a (CaseOf a)
344  | ExprLet a (LetIn a)
345  | ExprDo a (DoBlock a)
346  | ExprAdo a (AdoBlock a)
347  deriving (Show, Eq, Ord, Functor, Foldable, Traversable, Generic)
348
349data RecordLabeled a
350  = RecordPun (Name Ident)
351  | RecordField Label SourceToken a
352  deriving (Show, Eq, Ord, Functor, Foldable, Traversable, Generic)
353
354data RecordUpdate a
355  = RecordUpdateLeaf Label SourceToken (Expr a)
356  | RecordUpdateBranch Label (DelimitedNonEmpty (RecordUpdate a))
357  deriving (Show, Eq, Ord, Functor, Foldable, Traversable, Generic)
358
359data RecordAccessor a = RecordAccessor
360  { recExpr :: Expr a
361  , recDot :: SourceToken
362  , recPath :: Separated Label
363  } deriving (Show, Eq, Ord, Functor, Foldable, Traversable, Generic)
364
365data Lambda a = Lambda
366  { lmbSymbol :: SourceToken
367  , lmbBinders :: NonEmpty (Binder a)
368  , lmbArr :: SourceToken
369  , lmbBody :: Expr a
370  } deriving (Show, Eq, Ord, Functor, Foldable, Traversable, Generic)
371
372data IfThenElse a = IfThenElse
373  { iteIf :: SourceToken
374  , iteCond :: Expr a
375  , iteThen :: SourceToken
376  , iteTrue :: Expr a
377  , iteElse :: SourceToken
378  , iteFalse :: Expr a
379  } deriving (Show, Eq, Ord, Functor, Foldable, Traversable, Generic)
380
381data CaseOf a = CaseOf
382  { caseKeyword :: SourceToken
383  , caseHead :: Separated (Expr a)
384  , caseOf :: SourceToken
385  , caseBranches :: NonEmpty (Separated (Binder a), Guarded a)
386  } deriving (Show, Eq, Ord, Functor, Foldable, Traversable, Generic)
387
388data LetIn a = LetIn
389  { letKeyword :: SourceToken
390  , letBindings :: NonEmpty (LetBinding a)
391  , letIn :: SourceToken
392  , letBody :: Expr a
393  } deriving (Show, Eq, Ord, Functor, Foldable, Traversable, Generic)
394
395data Where a = Where
396  { whereExpr :: Expr a
397  , whereBindings :: Maybe (SourceToken, NonEmpty (LetBinding a))
398  } deriving (Show, Eq, Ord, Functor, Foldable, Traversable, Generic)
399
400data LetBinding a
401  = LetBindingSignature a (Labeled (Name Ident) (Type a))
402  | LetBindingName a (ValueBindingFields a)
403  | LetBindingPattern a (Binder a) SourceToken (Where a)
404  deriving (Show, Eq, Ord, Functor, Foldable, Traversable, Generic)
405
406data DoBlock a = DoBlock
407  { doKeyword :: SourceToken
408  , doStatements :: NonEmpty (DoStatement a)
409  } deriving (Show, Eq, Ord, Functor, Foldable, Traversable, Generic)
410
411data DoStatement a
412  = DoLet SourceToken (NonEmpty (LetBinding a))
413  | DoDiscard (Expr a)
414  | DoBind (Binder a) SourceToken (Expr a)
415  deriving (Show, Eq, Ord, Functor, Foldable, Traversable, Generic)
416
417data AdoBlock a = AdoBlock
418  { adoKeyword :: SourceToken
419  , adoStatements :: [DoStatement a]
420  , adoIn :: SourceToken
421  , adoResult :: Expr a
422  } deriving (Show, Eq, Ord, Functor, Foldable, Traversable, Generic)
423
424data Binder a
425  = BinderWildcard a SourceToken
426  | BinderVar a (Name Ident)
427  | BinderNamed a (Name Ident) SourceToken (Binder a)
428  | BinderConstructor a (QualifiedName (N.ProperName 'N.ConstructorName)) [Binder a]
429  | BinderBoolean a SourceToken Bool
430  | BinderChar a SourceToken Char
431  | BinderString a SourceToken PSString
432  | BinderNumber a (Maybe SourceToken) SourceToken (Either Integer Double)
433  | BinderArray a (Delimited (Binder a))
434  | BinderRecord a (Delimited (RecordLabeled (Binder a)))
435  | BinderParens a (Wrapped (Binder a))
436  | BinderTyped a (Binder a) SourceToken (Type a)
437  | BinderOp a (Binder a) (QualifiedName (N.OpName 'N.ValueOpName)) (Binder a)
438  deriving (Show, Eq, Ord, Functor, Foldable, Traversable, Generic)
439