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 as P
16import qualified Parse.Primitives.Keyword as Keyword
17import qualified Parse.Primitives.Number as Number
18import qualified Parse.Primitives.Symbol as Symbol
19import qualified Parse.Primitives.Utf8 as Utf8
20import qualified Parse.Primitives.Variable as Var
21import Parse.Primitives.Whitespace (whitespace)
22import qualified Reporting.Annotation as A
23import qualified Reporting.Error.Syntax as E
24import qualified Reporting.Region as R
31term :: Parser Src.Pattern
34 do start <- getPosition
43termHelp :: R.Position -> Parser Src.Pattern
49 return (A.at start end Src.PAnything)
53 return (A.at start end (Src.PVar name))
55 do upper <- Var.foreignUpper
57 let region = R.Region start end
58 return $ A.at start end $
60 Var.Unqualified name ->
61 Src.PCtor region name []
63 Var.Qualified home name ->
64 Src.PCtorQual region home name []
66 do number <- Number.number
70 return (A.at start end (Src.PInt int))
73 P.noFloatsAllowedInPatterns
77 return (A.at start end (Src.PStr str))
79 do chr <- Utf8.character
81 return (A.at start end (Src.PChr chr))
91record :: R.Position -> Parser Src.Pattern
94 inContext start E.ExprRecord $
97 [ do var <- addLocation Var.lower
99 recordHelp start [var]
100 , do Symbol.rightCurly
102 return (A.at start end (Src.PRecord []))
106recordHelp :: R.Position -> [A.Located N.Name] -> Parser Src.Pattern
107recordHelp start vars =
111 var <- addLocation Var.lower
113 recordHelp start (var:vars)
114 , do Symbol.rightCurly
116 return (A.at start end (Src.PRecord vars))
124tuple :: R.Position -> Parser Src.Pattern
127 inContext start E.ExprTuple $
130 [ do (pattern, sPos) <- expression
132 tupleHelp start pattern []
133 , do Symbol.rightParen
135 return (A.at start end Src.PUnit)
139tupleHelp :: R.Position -> Src.Pattern -> [Src.Pattern] -> Parser Src.Pattern
140tupleHelp start firstPattern revPatterns =
144 (pattern, sPos) <- expression
146 tupleHelp start firstPattern (pattern : revPatterns)
147 , do Symbol.rightParen
148 case reverse revPatterns of
152 secondPattern : otherPatterns ->
153 do end <- getPosition
154 return (A.at start end (Src.PTuple firstPattern secondPattern otherPatterns))
162list :: R.Position -> Parser Src.Pattern
165 inContext start E.PatternList $
168 [ do (pattern, sPos) <- expression
170 listHelp start [pattern]
171 , do Symbol.rightSquare
173 return (A.at start end (Src.PList []))
177listHelp :: R.Position -> [Src.Pattern] -> Parser Src.Pattern
178listHelp start patterns =
182 (pattern, sPos) <- expression
184 listHelp start (pattern:patterns)
185 , do Symbol.rightSquare
187 return (A.at start end (Src.PList (reverse patterns)))
195expression :: Parser (Src.Pattern, SPos)
198 do start <- getPosition
200 exprHelp start [] cTerm
203exprHelp :: R.Position -> [Src.Pattern] -> (Src.Pattern, R.Position, SPos) -> Parser (Src.Pattern, SPos)
204exprHelp start patterns (pattern, _end, sPos) =
210 exprHelp start (pattern:patterns) cTerm
214 nameStart <- getPosition
216 newEnd <- getPosition
217 newSpace <- whitespace
218 let alias = A.at nameStart newEnd name
220 ( A.at start newEnd (Src.PAlias (List.foldl' cons pattern patterns) alias)
224 ( List.foldl' cons pattern patterns
230cons :: Src.Pattern -> Src.Pattern -> Src.Pattern
231cons tl@(A.At (R.Region _ end) _) hd@(A.At (R.Region start _) _) =
232 A.at start end (Src.PCons hd tl)
239exprTerm :: SParser Src.Pattern
243 do start <- getPosition
244 upper <- Var.foreignUpper
246 exprTermHelp (R.Region start end) upper start []
248 do t@(A.At (R.Region _ end) _) <- term
254exprTermHelp :: R.Region -> Var.Upper -> R.Position -> [Src.Pattern] -> SParser Src.Pattern
255exprTermHelp region upper start revArgs =
256 do end <- getPosition
261 exprTermHelp region upper start (arg:revArgs)
265 Var.Unqualified name ->
266 Src.PCtor region name (reverse revArgs)
268 Var.Qualified home name ->
269 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