on master help sign in
get correct regions for infix ops and tuples
acedd9cEvan Czaplicki
src/Parse/Expression.hs+28−36
@@ -90,45 +90,37 @@ listTerm =
90
90
91parensTerm :: IParser Source.Expr
91parensTerm :: IParser Source.Expr
92parensTerm =
92parensTerm =
93− choice
93+ let
94− [ try opFn
94+ mkFunc args realBody start end =
95− , parens (tupleFn <|> parened)
95+ foldr
96− ]
97− where
98− lambda start end x body =
99− A.at start end (E.Lambda (A.at start end (P.Var x)) body)
96+ (\arg body -> A.at start end (E.Lambda (A.at start end (P.Var arg)) body))
100−
101− var start end x =
102− A.at start end (E.rawVar x)
97+ (A.at start end (realBody (A.at start end . E.rawVar)))
98+ args
103
99
104− opFn =
100+ mkBinop op =
105− do (start, op, end) <- located (parens symOp)
106− return $
107− lambda start end "x" $
108− lambda start end "y" $
109− A.at start end $
110− E.Binop (Var.Raw op) (var start end "x") (var start end "y")
101+ mkFunc ["x","y"] (\var -> E.Binop (Var.Raw op) (var "x") (var "y"))
111
102
112 tupleFn =
103 tupleFn =
113− do (start, commas, end) <-
104+ do commas <- many1 comma
114− located (comma >> many (whitespace >> comma))
115−
116− let vars = map (('v':) . show) [ 0 .. length commas + 1 ]
105+ let args = map (('v':) . show) [ 0 .. length commas ]
117−
106+ return $ mkFunc args (\var -> E.tuple (map var args))
118− return $
107+
119− foldr
108+ parenedExpr =
120− (lambda start end)
121− (A.at start end (E.tuple (map (var start end) vars)))
122− vars
123−
124− parened =
125− do (start, expressions, end) <- located (commaSep expr)
109+ do expressions <- padded (commaSep expr)
126− return $
110+ return $ \start end ->
127− case expressions of
111+ case expressions of
128− [expression] ->
112+ [expression] ->
129− expression
113+ expression
130− _ ->
114+ _ ->
131− A.at start end (E.tuple expressions)
115+ A.at start end (E.tuple expressions)
116+ in
117+ do (start, mkExpr, end) <-
118+ located $ choice $
119+ [ mkBinop <$> try (parens symOp)
120+ , parens (tupleFn <|> parenedExpr)
121+ ]
122+ return (mkExpr start end)
123+
132
124
133
125
134recordTerm :: IParser Source.Expr
126recordTerm :: IParser Source.Expr