1{-# OPTIONS_GHC -Wall -fno-warn-unused-do-bind #-}
2{-# LANGUAGE OverloadedStrings #-}
10import qualified Data.List as List
11import qualified Data.Name as Name
13import qualified AST.Source as Src
14import Parse.Utils (Parser, SParser, SPos, checkSpace, spaces, whitespace)
15import qualified Parse.Keyword as Keyword
16import qualified Parse.Number as Number
17import qualified Parse.Symbol as Symbol
18import qualified Parse.Utf8 as Utf8
19import qualified Parse.Variable as Var
20import qualified Parse.Primitives as P
21import Parse.Primitives (addLocation, getPosition, inContext, oneOf, word1)
22import qualified Reporting.Annotation as A
23import qualified Reporting.Error.Syntax as E
30term :: Parser Src.Pattern
32 do start <- getPosition
41termHelp :: A.Position -> Parser Src.Pattern
47 return (A.at start end Src.PAnything)
51 return (A.at start end (Src.PVar name))
53 do upper <- Var.foreignUpper
55 let region = A.Region start end
56 return $ A.at start end $
58 Var.Unqualified name ->
59 Src.PCtor region name []
61 Var.Qualified home name ->
62 Src.PCtorQual region home name []
64 do number <- Number.number
68 return (A.at start end (Src.PInt int))
71 noFloatsAllowedInPatterns
75 return (A.at start end (Src.PStr str))
77 do chr <- Utf8.character
79 return (A.at start end (Src.PChr chr))
83noFloatsAllowedInPatterns :: Parser a
84noFloatsAllowedInPatterns =
85 P.Parser $ \(P.State _ _ _ row col ctx) _ _ cerr _ ->
86 cerr row col ctx E.FloatInPattern
93record :: A.Position -> Parser Src.Pattern
95 inContext E.ExprRecord (word1 0x7B {- { -} E.XXX) $
98 [ do var <- addLocation Var.lower
100 recordHelp start [var]
101 , do word1 0x7D {-}-} E.XXX
103 return (A.at start end (Src.PRecord []))
107recordHelp :: A.Position -> [A.Located Name.Name] -> Parser Src.Pattern
108recordHelp start vars =
110 [ do word1 0x2C {-,-} E.XXX
112 var <- addLocation Var.lower
114 recordHelp start (var:vars)
115 , do word1 0x7D {-}-} E.XXX
117 return (A.at start end (Src.PRecord vars))
125tuple :: A.Position -> Parser Src.Pattern
127 inContext E.ExprTuple (word1 0x28 {-(-} E.XXX) $
130 [ do (pattern, sPos) <- expression
132 tupleHelp start pattern []
133 , do word1 0x29 {-)-} E.XXX
135 return (A.at start end Src.PUnit)
139tupleHelp :: A.Position -> Src.Pattern -> [Src.Pattern] -> Parser Src.Pattern
140tupleHelp start firstPattern revPatterns =
142 [ do word1 0x2C {-,-} E.XXX
144 (pattern, sPos) <- expression
146 tupleHelp start firstPattern (pattern : revPatterns)
147 , do word1 0x29 {-)-} E.XXX
148 case reverse revPatterns of
152 secondPattern : otherPatterns ->
153 do end <- getPosition
154 return (A.at start end (Src.PTuple firstPattern secondPattern otherPatterns))
162list :: A.Position -> Parser Src.Pattern
164 inContext E.PatternList (word1 0x5B {-[-} E.XXX) $
167 [ do (pattern, sPos) <- expression
169 listHelp start [pattern]
170 , do word1 0x5D {-]-} E.XXX
172 return (A.at start end (Src.PList []))
176listHelp :: A.Position -> [Src.Pattern] -> Parser Src.Pattern
177listHelp start patterns =
179 [ do word1 0x2C {-,-} E.XXX
181 (pattern, sPos) <- expression
183 listHelp start (pattern:patterns)
184 , do word1 0x5D {-]-} E.XXX
186 return (A.at start end (Src.PList (reverse patterns)))
194expression :: Parser (Src.Pattern, SPos)
196 do start <- getPosition
198 exprHelp start [] cTerm
201exprHelp :: A.Position -> [Src.Pattern] -> (Src.Pattern, A.Position, SPos) -> Parser (Src.Pattern, SPos)
202exprHelp start patterns (pattern, _end, sPos) =
205 word1 0x3A {-:-} E.XXX
208 exprHelp start (pattern:patterns) cTerm
212 nameStart <- getPosition
214 newEnd <- getPosition
215 newSpace <- whitespace
216 let alias = A.at nameStart newEnd name
218 ( A.at start newEnd (Src.PAlias (List.foldl' cons pattern patterns) alias)
222 ( List.foldl' cons pattern patterns
228cons :: Src.Pattern -> Src.Pattern -> Src.Pattern
230 A.merge hd tl (Src.PCons hd tl)
237exprTerm :: SParser Src.Pattern
241 do start <- getPosition
242 upper <- Var.foreignUpper
244 exprTermHelp (A.Region start end) upper start []
246 do t@(A.At (A.Region _ end) _) <- term
252exprTermHelp :: A.Region -> Var.Upper -> A.Position -> [Src.Pattern] -> SParser Src.Pattern
253exprTermHelp region upper start revArgs =
254 do end <- getPosition
259 exprTermHelp region upper start (arg:revArgs)
263 Var.Unqualified name ->
264 Src.PCtor region name (reverse revArgs)
266 Var.Qualified home name ->
267 Src.PCtorQual region home name (reverse revArgs)
keysesc to close
- j k
- move down, up
- enter
- open
- esc
- back, or up a level
- 1 2 3 4
- readme, files, commits, refs
- /
- filter
- y
- copy the clone command
- c
- compare the chosen commit with another (or shift-click both)
- ?
- show or hide this list