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