1{-# OPTIONS_GHC -Wall -fno-warn-unused-do-bind #-}
2{-# LANGUAGE OverloadedStrings #-}
10import qualified Data.List as List
12import qualified AST.Expression.Source as Src
13import qualified Elm.Name as N
14import qualified Parse.Literal as Literal
15import Parse.Primitives (Parser, SParser, SPos, addLocation, checkSpace, getPosition, hint, inContext, spaces, oneOf)
16import qualified Parse.Primitives.Keyword as Keyword
17import qualified Parse.Primitives.Symbol as Symbol
18import qualified Parse.Primitives.Variable as Var
19import Parse.Primitives.Whitespace (whitespace)
20import qualified Reporting.Annotation as A
21import qualified Reporting.Error.Syntax as E
22import qualified Reporting.Region as R
29term :: Parser Src.Pattern
32 do start <- getPosition
41termHelp :: R.Position -> Parser Src.Pattern
47 return (A.at start end Src.PAnything)
51 return (A.at start end (Src.PVar name))
53 do (maybePrefix, name) <- Var.foreignUpper
55 let ctor = Src.PCtor (R.Region start end) maybePrefix name []
56 return (A.at start end ctor)
58 do lit <- Literal.literal
60 return (A.at start end (Src.PLiteral lit))
70record :: R.Position -> Parser Src.Pattern
73 inContext start E.ExprRecord $
76 [ do var <- addLocation Var.lower
78 recordHelp start [var]
79 , do Symbol.rightCurly
81 return (A.at start end (Src.PRecord []))
85recordHelp :: R.Position -> [A.Located N.Name] -> Parser Src.Pattern
86recordHelp start vars =
90 var <- addLocation Var.lower
92 recordHelp start (var:vars)
93 , do Symbol.rightCurly
95 return (A.at start end (Src.PRecord vars))
103tuple :: R.Position -> Parser Src.Pattern
106 inContext start E.ExprTuple $
109 [ do (pattern, sPos) <- expression
111 tupleHelp start pattern []
112 , do Symbol.rightParen
114 return (A.at start end Src.PUnit)
118tupleHelp :: R.Position -> Src.Pattern -> [Src.Pattern] -> Parser Src.Pattern
119tupleHelp start firstPattern revPatterns =
123 (pattern, sPos) <- expression
125 tupleHelp start firstPattern (pattern : revPatterns)
126 , do Symbol.rightParen
127 case reverse revPatterns of
131 secondPattern : otherPatterns ->
132 do end <- getPosition
133 return (A.at start end (Src.PTuple firstPattern secondPattern otherPatterns))
141list :: R.Position -> Parser Src.Pattern
144 inContext start E.PatternList $
147 [ do (pattern, sPos) <- expression
149 listHelp start [pattern]
150 , do Symbol.rightSquare
152 return (A.at start end (Src.PList []))
156listHelp :: R.Position -> [Src.Pattern] -> Parser Src.Pattern
157listHelp start patterns =
161 (pattern, sPos) <- expression
163 listHelp start (pattern:patterns)
164 , do Symbol.rightSquare
166 return (A.at start end (Src.PList (reverse patterns)))
174expression :: Parser (Src.Pattern, SPos)
177 do start <- getPosition
179 exprHelp start [] cTerm
182exprHelp :: R.Position -> [Src.Pattern] -> (Src.Pattern, R.Position, SPos) -> Parser (Src.Pattern, SPos)
183exprHelp start patterns (pattern, _end, sPos) =
189 exprHelp start (pattern:patterns) cTerm
193 nameStart <- getPosition
195 newEnd <- getPosition
196 newSpace <- whitespace
197 let alias = A.at nameStart newEnd name
199 ( A.at start newEnd (Src.PAlias (List.foldl' cons pattern patterns) alias)
203 ( List.foldl' cons pattern patterns
209cons :: Src.Pattern -> Src.Pattern -> Src.Pattern
210cons tl@(A.A (R.Region _ end) _) hd@(A.A (R.Region start _) _) =
211 A.at start end (Src.PCons hd tl)
218exprTerm :: SParser Src.Pattern
221 [ do start <- getPosition
222 pair <- Var.foreignUpper
223 exprTermHelp start pair []
225 , (,,) <$> term <*> getPosition <*> whitespace
229exprTermHelp :: R.Position -> (Maybe N.Name, N.Name) -> [Src.Pattern] -> SParser Src.Pattern
230exprTermHelp start pair@(maybePrefix, name) args =
231 do end <- getPosition
236 exprTermHelp start pair (arg:args)
238 ( 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