1{-# OPTIONS_GHC -Wall -fno-warn-unused-do-bind #-}
2{-# LANGUAGE OverloadedStrings #-}
10import qualified Data.List as List
12import qualified AST.Pattern as P
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
32 do start <- getPosition
41termHelp :: R.Position -> Parser P.Raw
47 return (A.at start end P.RAnything)
51 return (A.at start end (P.RVar name))
53 do (maybePrefix, name) <- Var.foreignUpper
55 let ctor = P.RCtor (R.Region start end) maybePrefix name []
56 return (A.at start end ctor)
59 do lit <- Literal.literal
61 return (A.at start end (P.RLiteral lit))
71record :: R.Position -> Parser P.Raw
74 inContext start E.ExprRecord $
77 [ do var <- addLocation Var.lower
79 recordHelp start [var]
80 , do Symbol.rightCurly
82 return (A.at start end (P.RRecord []))
86recordHelp :: R.Position -> [A.Located N.Name] -> Parser P.Raw
87recordHelp start vars =
91 var <- addLocation Var.lower
93 recordHelp start (var:vars)
94 , do Symbol.rightCurly
96 return (A.at start end (P.RRecord vars))
104tuple :: R.Position -> Parser P.Raw
107 inContext start E.ExprTuple $
110 [ do (pattern, sPos) <- expression
112 tupleHelp start pattern []
113 , do Symbol.rightParen
115 return (A.at start end P.RUnit)
119tupleHelp :: R.Position -> P.Raw -> [P.Raw] -> Parser P.Raw
120tupleHelp start firstPattern revPatterns =
124 (pattern, sPos) <- expression
126 tupleHelp start firstPattern (pattern : revPatterns)
127 , do Symbol.rightParen
128 case reverse revPatterns of
132 secondPattern : otherPatterns ->
133 do end <- getPosition
134 return (A.at start end (P.RTuple firstPattern secondPattern otherPatterns))
142list :: R.Position -> Parser P.Raw
145 inContext start E.PatternList $
148 [ do (pattern, sPos) <- expression
150 listHelp start [pattern]
151 , do Symbol.rightSquare
153 return (A.at start end (P.RList []))
157listHelp :: R.Position -> [P.Raw] -> Parser P.Raw
158listHelp start patterns =
162 (pattern, sPos) <- expression
164 listHelp start (pattern:patterns)
165 , do Symbol.rightSquare
167 return (A.at start end (P.RList (reverse patterns)))
175expression :: Parser (P.Raw, SPos)
178 do start <- getPosition
180 exprHelp start [] cTerm
183exprHelp :: R.Position -> [P.Raw] -> (P.Raw, R.Position, SPos) -> Parser (P.Raw, SPos)
184exprHelp start patterns (pattern, _end, sPos) =
190 exprHelp start (pattern:patterns) cTerm
194 nameStart <- getPosition
196 newEnd <- getPosition
197 newSpace <- whitespace
198 let alias = A.at nameStart newEnd name
200 ( A.at start newEnd (P.RAlias (List.foldl' cons pattern patterns) alias)
204 ( List.foldl' cons pattern patterns
210cons :: P.Raw -> P.Raw -> P.Raw
211cons tl@(A.A (R.Region _ end) _) hd@(A.A (R.Region start _) _) =
212 A.at start end (P.RCons hd tl)
219exprTerm :: SParser P.Raw
222 [ do start <- getPosition
223 pair <- Var.foreignUpper
224 exprTermHelp start pair []
226 , (,,) <$> term <*> getPosition <*> whitespace
230exprTermHelp :: R.Position -> (Maybe N.Name, N.Name) -> [P.Raw] -> SParser P.Raw
231exprTermHelp start pair@(maybePrefix, name) args =
232 do end <- getPosition
237 exprTermHelp start pair (arg:args)
239 ( A.at start end (P.RCtor (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