1{-# OPTIONS_GHC -Wall -fno-warn-unused-do-bind #-}
2{-# LANGUAGE OverloadedStrings #-}
10import qualified Data.List as List
12import qualified AST.Source as Src
13import qualified Elm.Name as N
14import Parse.Primitives (Parser, SParser, SPos, addLocation, checkSpace, getPosition, hint, inContext, spaces, oneOf)
15import qualified Parse.Primitives.Keyword as Keyword
16import qualified Parse.Primitives.Number as Number
17import qualified Parse.Primitives.Symbol as Symbol
18import qualified Parse.Primitives.Utf8 as Utf8
19import qualified Parse.Primitives.Variable as Var
20import Parse.Primitives.Whitespace (whitespace)
21import qualified Reporting.Annotation as A
22import qualified Reporting.Error.Syntax as E
23import qualified Reporting.Region as R
30term :: Parser Src.Pattern
33 do start <- getPosition
42termHelp :: R.Position -> Parser Src.Pattern
48 return (A.at start end Src.PAnything)
52 return (A.at start end (Src.PVar name))
54 do upper <- Var.foreignUpper
56 let region = R.Region start end
57 return $ A.at start end $
59 Var.Unqualified name ->
60 Src.PCtor region name []
62 Var.Qualified home name ->
63 Src.PCtorQual region home name []
65 do number <- Number.number
69 return (A.at start end (Src.PInt int))
72 error "TODO floats are not allowed in pattern matches"
76 return (A.at start end (Src.PStr str))
78 do chr <- Utf8.character
80 return (A.at start end (Src.PChr chr))
90record :: R.Position -> Parser Src.Pattern
93 inContext start E.ExprRecord $
96 [ do var <- addLocation Var.lower
98 recordHelp start [var]
99 , do Symbol.rightCurly
101 return (A.at start end (Src.PRecord []))
105recordHelp :: R.Position -> [A.Located N.Name] -> Parser Src.Pattern
106recordHelp start vars =
110 var <- addLocation Var.lower
112 recordHelp start (var:vars)
113 , do Symbol.rightCurly
115 return (A.at start end (Src.PRecord vars))
123tuple :: R.Position -> Parser Src.Pattern
126 inContext start E.ExprTuple $
129 [ do (pattern, sPos) <- expression
131 tupleHelp start pattern []
132 , do Symbol.rightParen
134 return (A.at start end Src.PUnit)
138tupleHelp :: R.Position -> Src.Pattern -> [Src.Pattern] -> Parser Src.Pattern
139tupleHelp start firstPattern revPatterns =
143 (pattern, sPos) <- expression
145 tupleHelp start firstPattern (pattern : revPatterns)
146 , do Symbol.rightParen
147 case reverse revPatterns of
151 secondPattern : otherPatterns ->
152 do end <- getPosition
153 return (A.at start end (Src.PTuple firstPattern secondPattern otherPatterns))
161list :: R.Position -> Parser Src.Pattern
164 inContext start E.PatternList $
167 [ do (pattern, sPos) <- expression
169 listHelp start [pattern]
170 , do Symbol.rightSquare
172 return (A.at start end (Src.PList []))
176listHelp :: R.Position -> [Src.Pattern] -> Parser Src.Pattern
177listHelp start patterns =
181 (pattern, sPos) <- expression
183 listHelp start (pattern:patterns)
184 , do Symbol.rightSquare
186 return (A.at start end (Src.PList (reverse patterns)))
194expression :: Parser (Src.Pattern, SPos)
197 do start <- getPosition
199 exprHelp start [] cTerm
202exprHelp :: R.Position -> [Src.Pattern] -> (Src.Pattern, R.Position, SPos) -> Parser (Src.Pattern, SPos)
203exprHelp start patterns (pattern, _end, sPos) =
209 exprHelp start (pattern:patterns) cTerm
213 nameStart <- getPosition
215 newEnd <- getPosition
216 newSpace <- whitespace
217 let alias = A.at nameStart newEnd name
219 ( A.at start newEnd (Src.PAlias (List.foldl' cons pattern patterns) alias)
223 ( List.foldl' cons pattern patterns
229cons :: Src.Pattern -> Src.Pattern -> Src.Pattern
230cons tl@(A.At (R.Region _ end) _) hd@(A.At (R.Region start _) _) =
231 A.at start end (Src.PCons hd tl)
238exprTerm :: SParser Src.Pattern
242 do start <- getPosition
243 upper <- Var.foreignUpper
245 exprTermHelp (R.Region start end) upper start []
247 do t@(A.At (R.Region _ end) _) <- term
253exprTermHelp :: R.Region -> Var.Upper -> R.Position -> [Src.Pattern] -> SParser Src.Pattern
254exprTermHelp region upper start revArgs =
255 do end <- getPosition
260 exprTermHelp region upper start (arg:revArgs)
264 Var.Unqualified name ->
265 Src.PCtor region name (reverse revArgs)
267 Var.Qualified home name ->
268 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