on master help sign in
No more Bool literals / add locations to more pattern vars
commit02a7ce05810ffa1219c9f2bb39a6348d5d360ee7 authorEvan Czaplicki <evancz@users.noreply.github.com> dateFri 27 Oct 2017, 18:15 (9 years ago) parentc19392f
3 files changed+45−112
src/AST/Literal.hs−10 src/AST/Pattern.hs+14−72 src/Parse/Pattern.hs+31−30
src/AST/Literal.hs−10
@@ -30,7 +30,6 @@ data Literal
3030 | Str Text
3131 | IntNum Int
3232 | FloatNum Double
33− | Boolean Bool
3433 deriving (Eq, Ord)
3534
3635
@@ -41,7 +40,6 @@ toBuilder literal =
4140 Str s -> fromText ("\"" <> s <> "\"")
4241 IntNum n -> decimal n
4342 FloatNum n -> realFloat n
44− Boolean bool -> if bool then "True" else "False"
4543
4644
4745
@@ -104,12 +102,6 @@ instance Binary Literal where
104102 FloatNum n ->
105103 putWord8 3 >> put n
106104
107− Boolean True ->
108− putWord8 4
109−
110− Boolean False ->
111− putWord8 5
112−
113105 get =
114106 do word <- getWord8
115107 case word of
@@ -117,6 +109,4 @@ instance Binary Literal where
117109 1 -> Str <$> get
118110 2 -> IntNum <$> get
119111 3 -> FloatNum <$> get
120− 4 -> pure $ Boolean True
121− 5 -> pure $ Boolean False
122112 _ -> error "bad binary for AST.Literal"
src/AST/Pattern.hs+14−72
@@ -5,20 +5,15 @@ module AST.Pattern
55 , Raw_(..)
66 , Canonical
77 , Canonical_(..)
8− , boundVars
9− , member
10− , boundVarSet
11− , boundVarList
128 )
139 where
1410
1511
16−import qualified Data.Set as Set
17−import Data.Text (Text)
18−
19−import qualified AST.Literal as L
20−import qualified AST.Variable as Var
12+import qualified AST.Literal as Literal
13+import qualified AST.Module.Name as ModuleName
14+import qualified Elm.Name as N
2115import qualified Reporting.Annotation as A
16+import qualified Reporting.Region as R
2217
2318
2419
@@ -29,16 +24,16 @@ type Raw = A.Located Raw_
2924
3025
3126data Raw_
32− = RCtor (Maybe Text) Text [Raw]
33− | RRecord [Text]
27+ = RCtor R.Region (Maybe N.Name) N.Name [Raw]
28+ | RRecord [A.Located N.Name]
3429 | RUnit
3530 | RTuple Raw Raw [Raw]
3631 | RList [Raw]
3732 | RCons Raw Raw
38− | RAlias Text Raw
39− | RVar Text
33+ | RAlias Raw (A.Located N.Name)
34+ | RVar N.Name
4035 | RAnything
41− | RLiteral L.Literal
36+ | RLiteral Literal.Literal
4237
4338
4439
@@ -49,64 +44,11 @@ type Canonical = A.Located Canonical_
4944
5045
5146data Canonical_
52− = Ctor Var.Canonical [Canonical]
53− | Record [Text]
47+ = Ctor ModuleName.Canonical N.Name [Canonical]
48+ | Record [N.Name]
5449 | Unit
5550 | Tuple Canonical Canonical [Canonical]
56− | Alias Text Canonical
57− | Var Text
51+ | Alias Canonical N.Name
52+ | Var N.Name
5853 | Anything
59− | Literal L.Literal
60−
61−
62−
63−-- FIND VARIABLES
64−
65−
66−boundVars :: Raw -> [A.Located Text]
67−boundVars (A.A region pattern) =
68− case pattern of
69− RVar name ->
70− [ A.A region name ]
71−
72− RAlias name realPattern ->
73− A.A region name : boundVars realPattern
74−
75− RCtor _ _ patterns ->
76− concatMap boundVars patterns
77−
78− RRecord fields ->
79− map (A.A region) fields
80−
81− RUnit ->
82− []
83−
84− RTuple a b cs ->
85− concatMap boundVars (a:b:cs)
86−
87− RList xs ->
88− concatMap boundVars xs
89−
90− RCons a b ->
91− boundVars a ++ boundVars b
92−
93− RAnything ->
94− []
95−
96− RLiteral _ ->
97− []
98−
99−
100−member :: Text -> Raw -> Bool
101−member name pattern =
102− elem name (map A.drop (boundVars pattern))
103−
104−
105−boundVarSet :: Raw -> Set.Set Text
106−boundVarSet pattern =
107− Set.fromList (map A.drop (boundVars pattern))
108−
109−
110−boundVarList :: Raw -> [Text]
111−boundVarList pattern =
112− Set.toList (boundVarSet pattern)
54+ | Literal Literal.Literal
src/Parse/Pattern.hs+31−30
@@ -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 )