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 (maybePrefix, name) <- Var.foreignUpper
56 let ctor = Src.PCtor (R.Region start end) maybePrefix name []
57 return (A.at start end ctor)
59 do number <- Number.number
63 return (A.at start end (Src.PInt int))
66 error "TODO floats are not allowed in pattern matches"
70 return (A.at start end (Src.PStr str))
72 do chr <- Utf8.character
74 return (A.at start end (Src.PChr chr))
84record :: R.Position -> Parser Src.Pattern
87 inContext start E.ExprRecord $
90 [ do var <- addLocation Var.lower
92 recordHelp start [var]
93 , do Symbol.rightCurly
95 return (A.at start end (Src.PRecord []))
99recordHelp :: R.Position -> [A.Located N.Name] -> Parser Src.Pattern
100recordHelp start vars =
104 var <- addLocation Var.lower
106 recordHelp start (var:vars)
107 , do Symbol.rightCurly
109 return (A.at start end (Src.PRecord vars))
117tuple :: R.Position -> Parser Src.Pattern
120 inContext start E.ExprTuple $
123 [ do (pattern, sPos) <- expression
125 tupleHelp start pattern []
126 , do Symbol.rightParen
128 return (A.at start end Src.PUnit)
132tupleHelp :: R.Position -> Src.Pattern -> [Src.Pattern] -> Parser Src.Pattern
133tupleHelp start firstPattern revPatterns =
137 (pattern, sPos) <- expression
139 tupleHelp start firstPattern (pattern : revPatterns)
140 , do Symbol.rightParen
141 case reverse revPatterns of
145 secondPattern : otherPatterns ->
146 do end <- getPosition
147 return (A.at start end (Src.PTuple firstPattern secondPattern otherPatterns))
155list :: R.Position -> Parser Src.Pattern
158 inContext start E.PatternList $
161 [ do (pattern, sPos) <- expression
163 listHelp start [pattern]
164 , do Symbol.rightSquare
166 return (A.at start end (Src.PList []))
170listHelp :: R.Position -> [Src.Pattern] -> Parser Src.Pattern
171listHelp start patterns =
175 (pattern, sPos) <- expression
177 listHelp start (pattern:patterns)
178 , do Symbol.rightSquare
180 return (A.at start end (Src.PList (reverse patterns)))
188expression :: Parser (Src.Pattern, SPos)
191 do start <- getPosition
193 exprHelp start [] cTerm
196exprHelp :: R.Position -> [Src.Pattern] -> (Src.Pattern, R.Position, SPos) -> Parser (Src.Pattern, SPos)
197exprHelp start patterns (pattern, _end, sPos) =
203 exprHelp start (pattern:patterns) cTerm
207 nameStart <- getPosition
209 newEnd <- getPosition
210 newSpace <- whitespace
211 let alias = A.at nameStart newEnd name
213 ( A.at start newEnd (Src.PAlias (List.foldl' cons pattern patterns) alias)
217 ( List.foldl' cons pattern patterns
223cons :: Src.Pattern -> Src.Pattern -> Src.Pattern
224cons tl@(A.A (R.Region _ end) _) hd@(A.A (R.Region start _) _) =
225 A.at start end (Src.PCons hd tl)
232exprTerm :: SParser Src.Pattern
235 [ do start <- getPosition
236 pair <- Var.foreignUpper
237 exprTermHelp start pair []
239 , (,,) <$> term <*> getPosition <*> whitespace
243exprTermHelp :: R.Position -> (Maybe N.Name, N.Name) -> [Src.Pattern] -> SParser Src.Pattern
244exprTermHelp start pair@(maybePrefix, name) args =
245 do end <- getPosition
250 exprTermHelp start pair (arg:args)
252 ( A.at start end (Src.PCtor (R.Region start end) maybePrefix name (reverse args))
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