@@ -8,12 +8,11 @@ module Parse.Pattern
88
99
1010import qualified Data.List as List
11−import Data.Text (Text)
1211
13−import qualified AST.Literal as L
1412import qualified AST.Pattern as P
13+import qualified Elm.Name as N
1514import qualified Parse.Literal as Literal
16−import Parse.Primitives (Parser, SParser, SPos, checkSpace, getPosition, hint, inContext, spaces, oneOf)
15+import Parse.Primitives (Parser, SParser, SPos, addLocation, checkSpace, getPosition, hint, inContext, spaces, oneOf)
1716import qualified Parse.Primitives.Keyword as Keyword
1817import qualified Parse.Primitives.Symbol as Symbol
1918import qualified Parse.Primitives.Variable as Var
@@ -41,28 +40,28 @@ term =
4140
4241termHelp :: R.Position -> Parser P.Raw
4342termHelp start =
44− do pattern <-
45− oneOf
46− [ Symbol.underscore >> return P.RAnything
47− , P.RVar <$> Var.lower
48− , upperTerm <$> Var.foreignUpper
49− , P.RLiteral <$> Literal.literal
50− ]
51− end <- getPosition
52− return (A.at start end pattern)
53−
43+ oneOf
44+ [
45+ do Symbol.underscore
46+ end <- getPosition
47+ return (A.at start end P.RAnything)
48+ ,
49+ do name <- Var.lower
50+ end <- getPosition
51+ return (A.at start end (P.RVar name))
52+ ,
53+ do (maybePrefix, name) <- Var.foreignUpper
54+ end <- getPosition
55+ let ctor = P.RCtor (R.Region start end) maybePrefix name []
56+ return (A.at start end ctor)
5457
55−upperTerm :: (Maybe Text, Text) -> P.Raw_
56−upperTerm pair =
57− case pair of
58− (Nothing, "True") ->
59− P.RLiteral (L.Boolean True)
58+ ,
59+ do lit <- Literal.literal
60+ end <- getPosition
61+ return (A.at start end (P.RLiteral lit))
62+ ]
6063
61− (Nothing, "False") ->
62− P.RLiteral (L.Boolean False)
6364
64− (maybePrefix, name) ->
65− P.RCtor maybePrefix name []
6665
6766
6867
@@ -75,7 +74,7 @@ record start =
7574 inContext start E.ExprRecord $
7675 do spaces
7776 oneOf
78− [ do var <- Var.lower
77+ [ do var <- addLocation Var.lower
7978 spaces
8079 recordHelp start [var]
8180 , do Symbol.rightCurly
@@ -84,12 +83,12 @@ record start =
8483 ]
8584
8685
87−recordHelp :: R.Position -> [Text] -> Parser P.Raw
86+recordHelp :: R.Position -> [A.Located N.Name] -> Parser P.Raw
8887recordHelp start vars =
8988 oneOf
9089 [ do Symbol.comma
9190 spaces
92− var <- Var.lower
91+ var <- addLocation Var.lower
9392 spaces
9493 recordHelp start (var:vars)
9594 , do Symbol.rightCurly
@@ -192,11 +191,13 @@ exprHelp start patterns (pattern, _end, sPos) =
192191 , do checkSpace sPos
193192 Keyword.as_
194193 spaces
195− alias <- Var.lower
194+ nameStart <- getPosition
195+ name <- Var.lower
196196 newEnd <- getPosition
197197 newSpace <- whitespace
198+ let alias = A.at nameStart newEnd name
198199 return
199− ( A.at start newEnd (P.RAlias alias (List.foldl' cons pattern patterns))
200+ ( A.at start newEnd (P.RAlias (List.foldl' cons pattern patterns) alias)
200201 , newSpace
201202 )
202203 , return
@@ -226,8 +227,8 @@ exprTerm =
226227 ]
227228
228229
229−exprTermHelp :: R.Position -> (Maybe Text, Text) -> [P.Raw] -> SParser P.Raw
230−exprTermHelp start pair@(prefix, name) args =
230+exprTermHelp :: R.Position -> (Maybe N.Name, N.Name) -> [P.Raw] -> SParser P.Raw
231+exprTermHelp start pair@(maybePrefix, name) args =
231232 do end <- getPosition
232233 sPos <- whitespace
233234 oneOf
@@ -235,7 +236,7 @@ exprTermHelp start pair@(prefix, name) args =
235236 arg <- term
236237 exprTermHelp start pair (arg:args)
237238 , return
238− ( A.at start end (P.RCtor prefix name (reverse args))
239+ ( A.at start end (P.RCtor (R.Region start end) maybePrefix name (reverse args))
239240 , end
240241 , sPos
241242 )