on master help sign in
Make "accessible" a bit more readable
545b8abEvan Czaplicki
src/Parse/Helpers.hs+26−16
@@ -251,23 +251,33 @@ located p =
251
251
252
252
253accessible :: IParser Source.Expr -> IParser Source.Expr
253accessible :: IParser Source.Expr -> IParser Source.Expr
254−accessible expr =
254+accessible exprParser =
255 do start <- getPosition
255 do start <- getPosition
256− ce@(Annotation.A _ e) <- expr
256+
257− let rest f = do
257+ annotatedRootExpr@(Annotation.A _ rootExpr) <- exprParser
258− let dot = char '.' >> notFollowedBy (char '.')
258+
259− access <- optionMaybe (try dot <?> "field access (e.g. List.map)")
259+ access <- optionMaybe (try dot <?> "field access (e.g. List.map)")
260+
260− case access of
261+ case access of
261− Nothing -> return ce
262+ Nothing ->
263+ return annotatedRootExpr
264+
265+ Just _ ->
262− Just _ -> accessible $ do
266+ accessible $
263− v <- var <?> "field access (e.g. List.map)"
267+ do v <- var <?> "field access (e.g. List.map)"
264− end <- getPosition
268+ end <- getPosition
265− return (Annotation.at start end (f v))
269+ return . Annotation.at start end $
266− case e of
270+ case rootExpr of
267− E.Var (Variable.Raw (c:cs))
271+ E.Var (Variable.Raw name@(c:_))
268− | isUpper c -> rest (\v -> E.rawVar (c:cs ++ '.':v))
272+ | isUpper c ->
269− | otherwise -> rest (E.Access ce)
273+ E.rawVar (name ++ '.' : v)
270− _ -> rest (E.Access ce)
274+ _ ->
275+ E.Access annotatedRootExpr v
276+
277+
278+dot :: IParser ()
279+dot =
280+ char '.' >> notFollowedBy (char '.')
271
281
272
282
273-- WHITESPACE
283-- WHITESPACE