on master help sign in
cosmetic: make it simpler to get locations for parses
commit03cf56d8ec87f0ab8b9f695c14e9b4d9d5a11e46 authorEvan Czaplicki <info@elm-lang.org> dateMon 14 Oct 2013, 22:38 (13 years ago) parent4e82d19
2 files changed+18−20
compiler/Parse/Expression.hs+9−17 compiler/Parse/Helpers.hs+9−3
compiler/Parse/Expression.hs+9−17
@@ -32,17 +32,14 @@ toVar v = case v of "True" -> Literal (Literal.Boolean True)
3232
3333accessor :: IParser (Expr t v)
3434accessor = do
35− start <- getPosition
36− lbl <- try (string "." >> rLabel)
37− end <- getPosition
35+ (start, lbl, end) <- located (try (string "." >> rLabel))
3836 let loc e = Location.at start end e
3937 return (Lambda (PVar "_") (loc $ Access (loc $ Var "_") lbl))
4038
4139negative :: IParser (Expr t v)
4240negative = do
43− start <- getPosition
44− nTerm <- try (char '-' >> notFollowedBy (char '.' <|> char '-')) >> term
45− end <- getPosition
41+ (start, nTerm, end) <-
42+ located (try (char '-' >> notFollowedBy (char '.' <|> char '-')) >> term)
4643 let loc e = Location.at start end e
4744 return (Binop "-" (loc $ Literal (Literal.IntNum 0)) nTerm)
4845
@@ -77,29 +74,24 @@ parensTerm :: IParser (LExpr t v)
7774parensTerm = try (parens opFn) <|> parens (tupleFn <|> parened)
7875 where
7976 opFn = do
80− start <- getPosition
81− op <- anyOp
82− end <- getPosition
77+ (start, op, end) <- located anyOp
8378 let loc = Location.at start end
8479 return . loc . Lambda (PVar "x") . loc . Lambda (PVar "y") . loc $
8580 Binop op (loc $ Var "x") (loc $ Var "y")
8681
8782 tupleFn = do
88− start <- getPosition
8983 let comma = char ',' <?> "comma ','"
90− commas <- comma >> many (whitespace >> comma)
91− end <- getPosition
84+ (start, commas, end) <- located (comma >> many (whitespace >> comma))
9285 let vars = map (('v':) . show) [ 0 .. length commas + 1 ]
9386 loc = Location.at start end
9487 return $ foldr (\x e -> loc $ Lambda x e)
9588 (loc . tuple $ map (loc . Var) vars) (map PVar vars)
9689
9790 parened = do
98− start <- getPosition
99− es <- commaSep expr
100− end <- getPosition
101− return $ case es of [e] -> e
102− _ -> Location.at start end (tuple es)
91+ (start, es, end) <- located (commaSep expr)
92+ return $ case es of
93+ [e] -> e
94+ _ -> Location.at start end (tuple es)
10395
10496recordTerm :: IParser (LExpr t v)
10597recordTerm = brackets $ choice [ misc, addLocation record ]
compiler/Parse/Helpers.hs+9−3
@@ -9,6 +9,7 @@ import qualified Data.Map as Map
99import SourceSyntax.Helpers as Help
1010import SourceSyntax.Location as Location
1111import SourceSyntax.Expression
12+import SourceSyntax.PrettyPrint
1213import SourceSyntax.Declaration (Assoc)
1314import Text.Parsec hiding (newline,spaces,State)
1415import Text.Parsec.Indent
@@ -165,12 +166,17 @@ parens = surround '(' ')' "paren"
165166brackets :: IParser a -> IParser a
166167brackets = surround '{' '}' "bracket"
167168
168−addLocation :: IParser (Expr t v) -> IParser (LExpr t v)
169+addLocation :: (Pretty a) => IParser a -> IParser (Location.Located a)
169170addLocation expr = do
171+ (start, e, end) <- located expr
172+ return (Location.at start end e)
173+
174+located :: IParser a -> IParser (SourcePos, a, SourcePos)
175+located p = do
170176 start <- getPosition
171− e <- expr
177+ e <- p
172178 end <- getPosition
173− return (Location.at start end e)
179+ return (start, e, end)
174180
175181accessible :: IParser (LExpr t v) -> IParser (LExpr t v)
176182accessible expr = do