git.iko.soy/rowtype-yoga/purescript-native
on golang help sign in
Merge pull request #2559 from purescript/phil/parse-named-binders
9663867Phil Freeman
examples/passing/ParseNamedBinder.pursnew file+9
@@ -0,0 +1,9 @@
1+module Main where
2+
3+import Control.Monad.Eff.Console (log)
4+
5+data X = X
6+
7+f a@X X = a
8+
9+main = log "Done"
src/Language/PureScript/Parser/Common.hs+49−73
@@ -1,52 +1,39 @@
1−-- |
1+-- | Useful common functions for building parsers
2−-- Constants and utility functions to be used when parsing
3−--
4module Language.PureScript.Parser.Common where
2module Language.PureScript.Parser.Common where
5
3
6−import Prelude.Compat
4+import Prelude.Compat
7
5
8−import Control.Applicative ((<|>))
6+import Control.Applicative ((<|>))
9−import Control.Monad (guard)
7+import Control.Monad (guard)
8+import Data.Maybe (fromMaybe)
10−import Data.Monoid ((<>))
9+import Data.Monoid ((<>))
11−import Data.Text (Text)
10+import Data.Text (Text)
12import qualified Data.Text as T
11import qualified Data.Text as T
13−
14−import Language.PureScript.AST.SourcePos
12+import Language.PureScript.AST.SourcePos
15−import Language.PureScript.Comments
13+import Language.PureScript.Comments
16−import Language.PureScript.Names
14+import Language.PureScript.Names
17−import Language.PureScript.Parser.Lexer
15+import Language.PureScript.Parser.Lexer
18−import Language.PureScript.Parser.State
16+import Language.PureScript.Parser.State
19−import Language.PureScript.PSString (PSString, mkString)
17+import Language.PureScript.PSString (PSString, mkString)
20−
21import qualified Text.Parsec as P
18import qualified Text.Parsec as P
22
19
23−-- |
24−-- Parse a general proper name.
20+-- | Parse a general proper name.
25−--
26properName :: TokenParser (ProperName a)
21properName :: TokenParser (ProperName a)
27properName = ProperName <$> uname
22properName = ProperName <$> uname
28
23
29−-- |
30−-- Parse a proper name for a type.
24+-- | Parse a proper name for a type.
31−--
32typeName :: TokenParser (ProperName 'TypeName)
25typeName :: TokenParser (ProperName 'TypeName)
33typeName = ProperName <$> tyname
26typeName = ProperName <$> tyname
34
27
35−-- |
36−-- Parse a proper name for a kind.
28+-- | Parse a proper name for a kind.
37−--
38kindName :: TokenParser (ProperName 'KindName)
29kindName :: TokenParser (ProperName 'KindName)
39kindName = ProperName <$> kiname
30kindName = ProperName <$> kiname
40
31
41−-- |
42−-- Parse a proper name for a data constructor.
32+-- | Parse a proper name for a data constructor.
43−--
44dataConstructorName :: TokenParser (ProperName 'ConstructorName)
33dataConstructorName :: TokenParser (ProperName 'ConstructorName)
45dataConstructorName = ProperName <$> dconsname
34dataConstructorName = ProperName <$> dconsname
46
35
47−-- |
48−-- Parse a module name
36+-- | Parse a module name
49−--
50moduleName :: TokenParser ModuleName
37moduleName :: TokenParser ModuleName
51moduleName = part []
38moduleName = part []
52 where
39 where
@@ -55,9 +42,7 @@ moduleName = part []
55 <|> (ModuleName . snoc path . ProperName <$> mname)
42 <|> (ModuleName . snoc path . ProperName <$> mname)
56 snoc path name = path ++ [name]
43 snoc path name = path ++ [name]
57
44
58−-- |
59−-- Parse a qualified name, i.e. M.name or just name
45+-- | Parse a qualified name, i.e. M.name or just name
60−--
61parseQualified :: TokenParser a -> TokenParser (Qualified a)
46parseQualified :: TokenParser a -> TokenParser (Qualified a)
62parseQualified parser = part []
47parseQualified parser = part []
63 where
48 where
@@ -67,42 +52,30 @@ parseQualified parser = part []
67 updatePath path name = path ++ [name]
52 updatePath path name = path ++ [name]
68 qual path = if null path then Nothing else Just $ ModuleName path
53 qual path = if null path then Nothing else Just $ ModuleName path
69
54
70−-- |
71−-- Parse an identifier.
55+-- | Parse an identifier.
72−--
73parseIdent :: TokenParser Ident
56parseIdent :: TokenParser Ident
74parseIdent = Ident <$> identifier
57parseIdent = Ident <$> identifier
75
58
76−-- |
77−-- Parse a label, which may look like an identifier or a string
59+-- | Parse a label, which may look like an identifier or a string
78−--
79parseLabel :: TokenParser PSString
60parseLabel :: TokenParser PSString
80parseLabel = (mkString <$> lname) <|> stringLiteral
61parseLabel = (mkString <$> lname) <|> stringLiteral
81
62
82−-- |
83−-- Parse an operator.
63+-- | Parse an operator.
84−--
85parseOperator :: TokenParser (OpName a)
64parseOperator :: TokenParser (OpName a)
86parseOperator = OpName <$> symbol
65parseOperator = OpName <$> symbol
87
66
88−-- |
89−-- Run the first parser, then match the second if possible, applying the specified function on a successful match
67+-- | Run the first parser, then match the second if possible, applying the specified function on a successful match
90−--
91augment :: P.Stream s m t => P.ParsecT s u m a -> P.ParsecT s u m b -> (a -> b -> a) -> P.ParsecT s u m a
68augment :: P.Stream s m t => P.ParsecT s u m a -> P.ParsecT s u m b -> (a -> b -> a) -> P.ParsecT s u m a
92augment p q f = flip (maybe id $ flip f) <$> p <*> P.optionMaybe q
69augment p q f = flip (maybe id $ flip f) <$> p <*> P.optionMaybe q
93
70
94−-- |
95−-- Run the first parser, then match the second zero or more times, applying the specified function for each match
71+-- | Run the first parser, then match the second zero or more times, applying the specified function for each match
96−--
97fold :: P.ParsecT s u m a -> P.ParsecT s u m b -> (a -> b -> a) -> P.ParsecT s u m a
72fold :: P.ParsecT s u m a -> P.ParsecT s u m b -> (a -> b -> a) -> P.ParsecT s u m a
98fold first' more combine = do
73fold first' more combine = do
99 a <- first'
74 a <- first'
100 bs <- P.many more
75 bs <- P.many more
101 return $ foldl combine a bs
76 return $ foldl combine a bs
102
77
103−-- |
104−-- Build a parser from a smaller parser and a list of parsers for postfix operators
78+-- | Build a parser from a smaller parser and a list of parsers for postfix operators
105−--
106buildPostfixParser :: P.Stream s m t => [a -> P.ParsecT s u m a] -> P.ParsecT s u m a -> P.ParsecT s u m a
79buildPostfixParser :: P.Stream s m t => [a -> P.ParsecT s u m a] -> P.ParsecT s u m a -> P.ParsecT s u m a
107buildPostfixParser fs first' = do
80buildPostfixParser fs first' = do
108 a <- first'
81 a <- first'
@@ -114,9 +87,7 @@ buildPostfixParser fs first' = do
114 Nothing -> return a
87 Nothing -> return a
115 Just a' -> go a'
88 Just a' -> go a'
116
89
117−-- |
118−-- Mark the current indentation level
90+-- | Mark the current indentation level
119−--
120mark :: P.Parsec s ParseState a -> P.Parsec s ParseState a
91mark :: P.Parsec s ParseState a -> P.Parsec s ParseState a
121mark p = do
92mark p = do
122 current <- indentationLevel <$> P.getState
93 current <- indentationLevel <$> P.getState
@@ -126,9 +97,7 @@ mark p = do
126 P.modifyState $ \st -> st { indentationLevel = current }
97 P.modifyState $ \st -> st { indentationLevel = current }
127 return a
98 return a
128
99
129−-- |
130−-- Check that the current identation level matches a predicate
100+-- | Check that the current identation level matches a predicate
131−--
132checkIndentation
101checkIndentation
133 :: (P.Column -> Text)
102 :: (P.Column -> Text)
134 -> (P.Column -> P.Column -> Bool)
103 -> (P.Column -> P.Column -> Bool)
@@ -138,32 +107,39 @@ checkIndentation mkMsg rel = do
138 current <- indentationLevel <$> P.getState
107 current <- indentationLevel <$> P.getState
139 guard (col `rel` current) P.<?> T.unpack (mkMsg current)
108 guard (col `rel` current) P.<?> T.unpack (mkMsg current)
140
109
141−-- |
142−-- Check that the current indentation level is past the current mark
110+-- | Check that the current indentation level is past the current mark
143−--
144indented :: P.Parsec s ParseState ()
111indented :: P.Parsec s ParseState ()
145indented = checkIndentation (("indentation past column " <>) . (T.pack . show)) (>)
112indented = checkIndentation (("indentation past column " <>) . (T.pack . show)) (>)
146
113
147−-- |
148−-- Check that the current indentation level is at the same indentation as the current mark
114+-- | Check that the current indentation level is at the same indentation as the current mark
149−--
150same :: P.Parsec s ParseState ()
115same :: P.Parsec s ParseState ()
151same = checkIndentation (("indentation at column " <>) . (T.pack . show)) (==)
116same = checkIndentation (("indentation at column " <>) . (T.pack . show)) (==)
152
117
153−-- |
154−-- Read the comments from the the next token, without consuming it
118+-- | Read the comments from the the next token, without consuming it
155−--
156readComments :: P.Parsec [PositionedToken] u [Comment]
119readComments :: P.Parsec [PositionedToken] u [Comment]
157readComments = P.lookAhead $ ptComments <$> P.anyToken
120readComments = P.lookAhead $ ptComments <$> P.anyToken
158
121
159−-- |
160−-- Run a parser
122+-- | Run a parser
161−--
162runTokenParser :: FilePath -> TokenParser a -> [PositionedToken] -> Either P.ParseError a
123runTokenParser :: FilePath -> TokenParser a -> [PositionedToken] -> Either P.ParseError a
163runTokenParser filePath p = P.runParser p (ParseState 0) filePath
124runTokenParser filePath p = P.runParser p (ParseState 0) filePath
164
125
165−-- |
166−-- Convert from Parsec sourcepos
126+-- | Convert from Parsec sourcepos
167−--
168toSourcePos :: P.SourcePos -> SourcePos
127toSourcePos :: P.SourcePos -> SourcePos
169toSourcePos pos = SourcePos (P.sourceLine pos) (P.sourceColumn pos)
128toSourcePos pos = SourcePos (P.sourceLine pos) (P.sourceColumn pos)
129+
130+-- | Read source position information and comments
131+withSourceSpan
132+ :: (SourceSpan -> [Comment] -> a -> b)
133+ -> P.Parsec [PositionedToken] u a
134+ -> P.Parsec [PositionedToken] u b
135+withSourceSpan f p = do
136+ start <- P.getPosition
137+ comments <- readComments
138+ x <- p
139+ end <- P.getPosition
140+ input <- P.getInput
141+ let end' = case input of
142+ pt:_ -> ptPrevEndPos pt
143+ _ -> Nothing
144+ let sp = SourceSpan (P.sourceName start) (toSourcePos start) (toSourcePos $ fromMaybe end end')
145+ return $ f sp comments x
src/Language/PureScript/Parser/Declarations.hs+76−117
@@ -1,6 +1,4 @@
1−-- |
2−-- Parsers for module definitions and declarations
1+-- | Parsers for module definitions and declarations
3−--
4module Language.PureScript.Parser.Declarations
2module Language.PureScript.Parser.Declarations
5 ( parseDeclaration
3 ( parseDeclaration
6 , parseModule
4 , parseModule
@@ -15,53 +13,29 @@ module Language.PureScript.Parser.Declarations
15 , toPositionedError
13 , toPositionedError
16 ) where
14 ) where
17
15
18−import Prelude hiding (lex)
16+import Prelude hiding (lex)
19−
17+
20−import Data.Functor (($>))
21−import Data.Maybe (fromMaybe)
22−import Data.Text (Text)
23−
24−import Control.Applicative
18+import Control.Applicative
25−import Control.Arrow ((+++))
19+import Control.Arrow ((+++))
26−import Control.Monad.Error.Class (MonadError(..))
20+import Control.Monad.Error.Class (MonadError(..))
27−import Control.Parallel.Strategies (withStrategy, parList, rseq)
21+import Control.Parallel.Strategies (withStrategy, parList, rseq)
28−
22+import Data.Functor (($>))
23+import Data.Maybe (fromMaybe)
24+import Data.Text (Text)
29−import Language.PureScript.AST
25+import Language.PureScript.AST
30−import Language.PureScript.Comments
31−import Language.PureScript.Environment
26+import Language.PureScript.Environment
32−import Language.PureScript.Errors
27+import Language.PureScript.Errors
33−import Language.PureScript.Kinds
28+import Language.PureScript.Kinds
34−import Language.PureScript.Names
29+import Language.PureScript.Names
30+import Language.PureScript.Parser.Common
31+import Language.PureScript.Parser.Kinds
32+import Language.PureScript.Parser.Lexer
35−import Language.PureScript.Types
33+import Language.PureScript.Parser.Types
36−import Language.PureScript.PSString (PSString, mkString)
34+import Language.PureScript.PSString (PSString, mkString)
37−import Language.PureScript.Parser.Common
38−import Language.PureScript.Parser.Kinds
39−import Language.PureScript.Parser.Lexer
40−import Language.PureScript.Parser.Types
35+import Language.PureScript.Types
41−
42−import qualified Language.PureScript.Parser.Common as C
43import qualified Text.Parsec as P
36import qualified Text.Parsec as P
44import qualified Text.Parsec.Expr as P
37import qualified Text.Parsec.Expr as P
45
38
46−-- |
47−-- Read source position information
48−--
49−withSourceSpan
50− :: (SourceSpan -> [Comment] -> a -> a)
51− -> P.Parsec [PositionedToken] u a
52− -> P.Parsec [PositionedToken] u a
53−withSourceSpan f p = do
54− start <- P.getPosition
55− comments <- C.readComments
56− x <- p
57− end <- P.getPosition
58− input <- P.getInput
59− let end' = case input of
60− pt:_ -> ptPrevEndPos pt
61− _ -> Nothing
62− let sp = SourceSpan (P.sourceName start) (C.toSourcePos start) (C.toSourcePos $ fromMaybe end end')
63− return $ f sp comments x
64−
65kindedIdent :: TokenParser (Text, Maybe Kind)
39kindedIdent :: TokenParser (Text, Maybe Kind)
66kindedIdent = (, Nothing) <$> identifier
40kindedIdent = (, Nothing) <$> identifier
67 <|> parens ((,) <$> identifier <*> (Just <$> (indented *> doubleColon *> indented *> parseKind)))
41 <|> parens ((,) <$> identifier <*> (Just <$> (indented *> doubleColon *> indented *> parseKind)))
@@ -91,7 +65,7 @@ parseValueDeclaration :: TokenParser Declaration
91parseValueDeclaration = do
65parseValueDeclaration = do
92 name <- parseIdent
66 name <- parseIdent
93 binders <- P.many parseBinderNoParens
67 binders <- P.many parseBinderNoParens
94− value <- Left <$> (C.indented *>
68+ value <- Left <$> (indented *>
95 P.many1 ((,) <$> parseGuard
69 P.many1 ((,) <$> parseGuard
96 <*> (indented *> equals *> parseValueWithWhereClause)
70 <*> (indented *> equals *> parseValueWithWhereClause)
97 ))
71 ))
@@ -100,13 +74,13 @@ parseValueDeclaration = do
100 where
74 where
101 parseValueWithWhereClause :: TokenParser Expr
75 parseValueWithWhereClause :: TokenParser Expr
102 parseValueWithWhereClause = do
76 parseValueWithWhereClause = do
103− C.indented
77+ indented
104 value <- parseValue
78 value <- parseValue
105 whereClause <- P.optionMaybe $ do
79 whereClause <- P.optionMaybe $ do
106− C.indented
80+ indented
107 reserved "where"
81 reserved "where"
108− C.indented
82+ indented
109− C.mark $ P.many1 (C.same *> parseLocalDeclaration)
83+ mark $ P.many1 (same *> parseLocalDeclaration)
110 return $ maybe value (`Let` value) whereClause
84 return $ maybe value (`Let` value) whereClause
111
85
112parseExternDeclaration :: TokenParser Declaration
86parseExternDeclaration :: TokenParser Declaration
@@ -237,9 +211,7 @@ parseDerivingInstanceDeclaration = do
237positioned :: TokenParser Declaration -> TokenParser Declaration
211positioned :: TokenParser Declaration -> TokenParser Declaration
238positioned = withSourceSpan PositionedDeclaration
212positioned = withSourceSpan PositionedDeclaration
239
213
240−-- |
241−-- Parse a single declaration
214+-- | Parse a single declaration
242−--
243parseDeclaration :: TokenParser Declaration
215parseDeclaration :: TokenParser Declaration
244parseDeclaration = positioned (P.choice
216parseDeclaration = positioned (P.choice
245 [ parseDataDeclaration
217 [ parseDataDeclaration
@@ -259,12 +231,10 @@ parseLocalDeclaration = positioned (P.choice
259 , parseValueDeclaration
231 , parseValueDeclaration
260 ] P.<?> "local declaration")
232 ] P.<?> "local declaration")
261
233
262−-- |
263−-- Parse a module header and a collection of declarations
234+-- | Parse a module header and a collection of declarations
264−--
265parseModule :: TokenParser Module
235parseModule :: TokenParser Module
266parseModule = do
236parseModule = do
267− comments <- C.readComments
237+ comments <- readComments
268 start <- P.getPosition
238 start <- P.getPosition
269 reserved "module"
239 reserved "module"
270 indented
240 indented
@@ -280,7 +250,7 @@ parseModule = do
280 return (imports ++ decls)
250 return (imports ++ decls)
281 _ <- P.eof
251 _ <- P.eof
282 end <- P.getPosition
252 end <- P.getPosition
283− let ss = SourceSpan (P.sourceName start) (C.toSourcePos start) (C.toSourcePos end)
253+ let ss = SourceSpan (P.sourceName start) (toSourcePos start) (toSourcePos end)
284 return $ Module ss comments name decls exports
254 return $ Module ss comments name decls exports
285
255
286-- | Parse a collection of modules in parallel
256-- | Parse a collection of modules in parallel
@@ -301,7 +271,6 @@ parseModulesFromFiles toFilePath input =
301 inParallel :: [Either P.ParseError (k, a)] -> [Either P.ParseError (k, a)]
271 inParallel :: [Either P.ParseError (k, a)] -> [Either P.ParseError (k, a)]
302 inParallel = withStrategy (parList rseq)
272 inParallel = withStrategy (parList rseq)
303
273
304−
305-- | Parses a single module with FilePath for eventual parsing errors
274-- | Parses a single module with FilePath for eventual parsing errors
306parseModuleFromFile
275parseModuleFromFile
307 :: (k -> FilePath)
276 :: (k -> FilePath)
@@ -313,12 +282,12 @@ parseModuleFromFile toFilePath (k, content) = do
313 m <- runTokenParser filename parseModule ts
282 m <- runTokenParser filename parseModule ts
314 pure (k, m)
283 pure (k, m)
315
284
316−-- | Converts a @ParseError@ into a @PositionedError@
285+-- | Converts a 'ParseError' into a 'PositionedError'
317toPositionedError :: P.ParseError -> ErrorMessage
286toPositionedError :: P.ParseError -> ErrorMessage
318toPositionedError perr = ErrorMessage [ PositionedError (SourceSpan name start end) ] (ErrorParsingModule perr)
287toPositionedError perr = ErrorMessage [ PositionedError (SourceSpan name start end) ] (ErrorParsingModule perr)
319 where
288 where
320 name = (P.sourceName . P.errorPos) perr
289 name = (P.sourceName . P.errorPos) perr
321− start = (C.toSourcePos . P.errorPos) perr
290+ start = (toSourcePos . P.errorPos) perr
322 end = start
291 end = start
323
292
324booleanLiteral :: TokenParser Bool
293booleanLiteral :: TokenParser Bool
@@ -345,18 +314,18 @@ parseObjectLiteral p = ObjectLiteral <$> braces (commaSep p)
345parseIdentifierAndValue :: TokenParser (PSString, Expr)
314parseIdentifierAndValue :: TokenParser (PSString, Expr)
346parseIdentifierAndValue =
315parseIdentifierAndValue =
347 do
316 do
348− name <- C.indented *> lname
317+ name <- indented *> lname
349 b <- P.option (Var $ Qualified Nothing (Ident name)) rest
318 b <- P.option (Var $ Qualified Nothing (Ident name)) rest
350 return (mkString name, b)
319 return (mkString name, b)
351− <|> (,) <$> (C.indented *> stringLiteral) <*> rest
320+ <|> (,) <$> (indented *> stringLiteral) <*> rest
352 where
321 where
353− rest = C.indented *> colon *> C.indented *> parseValue
322+ rest = indented *> colon *> indented *> parseValue
354
323
355parseAbs :: TokenParser Expr
324parseAbs :: TokenParser Expr
356parseAbs = do
325parseAbs = do
357 symbol' "\\"
326 symbol' "\\"
358− args <- P.many1 (C.indented *> (Abs <$> (Left <$> C.parseIdent <|> Right <$> parseBinderNoParens)))
327+ args <- P.many1 (indented *> (Abs <$> (Left <$> parseIdent <|> Right <$> parseBinderNoParens)))
359− C.indented *> rarrow
328+ indented *> rarrow
360 value <- parseValue
329 value <- parseValue
361 return $ toFunction args value
330 return $ toFunction args value
362 where
331 where
@@ -364,18 +333,18 @@ parseAbs = do
364 toFunction args value = foldr ($) value args
333 toFunction args value = foldr ($) value args
365
334
366parseVar :: TokenParser Expr
335parseVar :: TokenParser Expr
367−parseVar = Var <$> C.parseQualified C.parseIdent
336+parseVar = Var <$> parseQualified parseIdent
368
337
369parseConstructor :: TokenParser Expr
338parseConstructor :: TokenParser Expr
370−parseConstructor = Constructor <$> C.parseQualified C.dataConstructorName
339+parseConstructor = Constructor <$> parseQualified dataConstructorName
371
340
372parseCase :: TokenParser Expr
341parseCase :: TokenParser Expr
373−parseCase = Case <$> P.between (reserved "case") (C.indented *> reserved "of") (commaSep1 parseValue)
342+parseCase = Case <$> P.between (reserved "case") (indented *> reserved "of") (commaSep1 parseValue)
374− <*> (C.indented *> C.mark (P.many1 (C.same *> C.mark parseCaseAlternative)))
343+ <*> (indented *> mark (P.many1 (same *> mark parseCaseAlternative)))
375
344
376parseCaseAlternative :: TokenParser CaseAlternative
345parseCaseAlternative :: TokenParser CaseAlternative
377parseCaseAlternative = CaseAlternative <$> commaSep1 parseBinder
346parseCaseAlternative = CaseAlternative <$> commaSep1 parseBinder
378− <*> (Left <$> (C.indented *>
347+ <*> (Left <$> (indented *>
379 P.many1 ((,) <$> parseGuard
348 P.many1 ((,) <$> parseGuard
380 <*> (indented *> rarrow *> parseValue)
349 <*> (indented *> rarrow *> parseValue)
381 ))
350 ))
@@ -383,16 +352,16 @@ parseCaseAlternative = CaseAlternative <$> commaSep1 parseBinder
383 P.<?> "case alternative"
352 P.<?> "case alternative"
384
353
385parseIfThenElse :: TokenParser Expr
354parseIfThenElse :: TokenParser Expr
386−parseIfThenElse = IfThenElse <$> (P.try (reserved "if") *> C.indented *> parseValue)
355+parseIfThenElse = IfThenElse <$> (P.try (reserved "if") *> indented *> parseValue)
387− <*> (C.indented *> reserved "then" *> C.indented *> parseValue)
356+ <*> (indented *> reserved "then" *> indented *> parseValue)
388− <*> (C.indented *> reserved "else" *> C.indented *> parseValue)
357+ <*> (indented *> reserved "else" *> indented *> parseValue)
389
358
390parseLet :: TokenParser Expr
359parseLet :: TokenParser Expr
391parseLet = do
360parseLet = do
392 reserved "let"
361 reserved "let"
393− C.indented
362+ indented
394− ds <- C.mark $ P.many1 (C.same *> parseLocalDeclaration)
363+ ds <- mark $ P.many1 (same *> parseLocalDeclaration)
395− C.indented
364+ indented
396 reserved "in"
365 reserved "in"
397 result <- parseValue
366 result <- parseValue
398 return $ Let ds result
367 return $ Let ds result
@@ -418,9 +387,7 @@ parseValueAtom = withSourceSpan PositionedValue $ P.choice
418 , parseHole
387 , parseHole
419 ]
388 ]
420
389
421−-- |
422−-- Parse an expression in backticks or an operator
390+-- | Parse an expression in backticks or an operator
423−--
424parseInfixExpr :: TokenParser Expr
391parseInfixExpr :: TokenParser Expr
425parseInfixExpr
392parseInfixExpr
426 = P.between tick tick parseValue
393 = P.between tick tick parseValue
@@ -432,25 +399,25 @@ parseHole = Hole <$> holeLit
432parsePropertyUpdate :: TokenParser (PSString, Expr)
399parsePropertyUpdate :: TokenParser (PSString, Expr)
433parsePropertyUpdate = do
400parsePropertyUpdate = do
434 name <- parseLabel
401 name <- parseLabel
435− _ <- C.indented *> equals
402+ _ <- indented *> equals
436− value <- C.indented *> parseValue
403+ value <- indented *> parseValue
437 return (name, value)
404 return (name, value)
438
405
439parseAccessor :: Expr -> TokenParser Expr
406parseAccessor :: Expr -> TokenParser Expr
440parseAccessor (Constructor _) = P.unexpected "constructor"
407parseAccessor (Constructor _) = P.unexpected "constructor"
441−parseAccessor obj = P.try $ Accessor <$> (C.indented *> dot *> C.indented *> parseLabel) <*> pure obj
408+parseAccessor obj = P.try $ Accessor <$> (indented *> dot *> indented *> parseLabel) <*> pure obj
442
409
443parseDo :: TokenParser Expr
410parseDo :: TokenParser Expr
444parseDo = do
411parseDo = do
445 reserved "do"
412 reserved "do"
446− C.indented
413+ indented
447− Do <$> C.mark (P.many1 (C.same *> C.mark parseDoNotationElement))
414+ Do <$> mark (P.many1 (same *> mark parseDoNotationElement))
448
415
449parseDoNotationLet :: TokenParser DoNotationElement
416parseDoNotationLet :: TokenParser DoNotationElement
450−parseDoNotationLet = DoNotationLet <$> (reserved "let" *> C.indented *> C.mark (P.many1 (C.same *> parseLocalDeclaration)))
417+parseDoNotationLet = DoNotationLet <$> (reserved "let" *> indented *> mark (P.many1 (same *> parseLocalDeclaration)))
451
418
452parseDoNotationBind :: TokenParser DoNotationElement
419parseDoNotationBind :: TokenParser DoNotationElement
453−parseDoNotationBind = DoNotationBind <$> P.try (parseBinder <* C.indented <* larrow) <*> parseValue
420+parseDoNotationBind = DoNotationBind <$> P.try (parseBinder <* indented <* larrow) <*> parseValue
454
421
455parseDoNotationElement :: TokenParser DoNotationElement
422parseDoNotationElement :: TokenParser DoNotationElement
456parseDoNotationElement = P.choice
423parseDoNotationElement = P.choice
@@ -461,33 +428,31 @@ parseDoNotationElement = P.choice
461
428
462-- | Expressions including indexers and record updates
429-- | Expressions including indexers and record updates
463indexersAndAccessors :: TokenParser Expr
430indexersAndAccessors :: TokenParser Expr
464−indexersAndAccessors = C.buildPostfixParser postfixTable parseValueAtom
431+indexersAndAccessors = buildPostfixParser postfixTable parseValueAtom
465 where
432 where
466 postfixTable = [ parseAccessor
433 postfixTable = [ parseAccessor
467 , P.try . parseUpdaterBody
434 , P.try . parseUpdaterBody
468 ]
435 ]
469
436
470−-- |
437+-- | Parse an expression
471−-- Parse a value
472−--
473parseValue :: TokenParser Expr
438parseValue :: TokenParser Expr
474parseValue = withSourceSpan PositionedValue
439parseValue = withSourceSpan PositionedValue
475 (P.buildExpressionParser operators
440 (P.buildExpressionParser operators
476− . C.buildPostfixParser postfixTable
441+ . buildPostfixParser postfixTable
477 $ indexersAndAccessors) P.<?> "expression"
442 $ indexersAndAccessors) P.<?> "expression"
478 where
443 where
479− postfixTable = [ \v -> P.try (flip App <$> (C.indented *> indexersAndAccessors)) <*> pure v
444+ postfixTable = [ \v -> P.try (flip App <$> (indented *> indexersAndAccessors)) <*> pure v
480− , \v -> flip (TypedValue True) <$> (C.indented *> doubleColon *> parsePolyType) <*> pure v
445+ , \v -> flip (TypedValue True) <$> (indented *> doubleColon *> parsePolyType) <*> pure v
481 ]
446 ]
482− operators = [ [ P.Prefix (C.indented *> symbol' "-" *> return UnaryMinus)
447+ operators = [ [ P.Prefix (indented *> symbol' "-" *> return UnaryMinus)
483 ]
448 ]
484− , [ P.Infix (P.try (C.indented *> parseInfixExpr P.<?> "infix expression") >>= \ident ->
449+ , [ P.Infix (P.try (indented *> parseInfixExpr P.<?> "infix expression") >>= \ident ->
485 return (BinaryNoParens ident)) P.AssocRight
450 return (BinaryNoParens ident)) P.AssocRight
486 ]
451 ]
487 ]
452 ]
488
453
489parseUpdaterBody :: Expr -> TokenParser Expr
454parseUpdaterBody :: Expr -> TokenParser Expr
490−parseUpdaterBody v = ObjectUpdate v <$> (C.indented *> braces (commaSep1 (C.indented *> parsePropertyUpdate)))
455+parseUpdaterBody v = ObjectUpdate v <$> (indented *> braces (commaSep1 (indented *> parsePropertyUpdate)))
491
456
492parseAnonymousArgument :: TokenParser Expr
457parseAnonymousArgument :: TokenParser Expr
493parseAnonymousArgument = underscore *> pure AnonymousArgument
458parseAnonymousArgument = underscore *> pure AnonymousArgument
@@ -501,21 +466,21 @@ parseNumberLiteral = LiteralBinder . NumericLiteral <$> (sign <*> number)
501 <|> return id
466 <|> return id
502
467
503parseNullaryConstructorBinder :: TokenParser Binder
468parseNullaryConstructorBinder :: TokenParser Binder
504−parseNullaryConstructorBinder = ConstructorBinder <$> C.parseQualified C.dataConstructorName <*> pure []
469+parseNullaryConstructorBinder = ConstructorBinder <$> parseQualified dataConstructorName <*> pure []
505
470
506parseConstructorBinder :: TokenParser Binder
471parseConstructorBinder :: TokenParser Binder
507−parseConstructorBinder = ConstructorBinder <$> C.parseQualified C.dataConstructorName <*> many (C.indented *> parseBinderNoParens)
472+parseConstructorBinder = ConstructorBinder <$> parseQualified dataConstructorName <*> many (indented *> parseBinderNoParens)
508
473
509parseObjectBinder:: TokenParser Binder
474parseObjectBinder:: TokenParser Binder
510−parseObjectBinder = LiteralBinder <$> parseObjectLiteral (C.indented *> parseIdentifierAndBinder)
475+parseObjectBinder = LiteralBinder <$> parseObjectLiteral (indented *> parseIdentifierAndBinder)
511
476
512parseArrayBinder :: TokenParser Binder
477parseArrayBinder :: TokenParser Binder
513−parseArrayBinder = LiteralBinder <$> parseArrayLiteral (C.indented *> parseBinder)
478+parseArrayBinder = LiteralBinder <$> parseArrayLiteral (indented *> parseBinder)
514
479
515parseVarOrNamedBinder :: TokenParser Binder
480parseVarOrNamedBinder :: TokenParser Binder
516parseVarOrNamedBinder = do
481parseVarOrNamedBinder = do
517− name <- C.parseIdent
482+ name <- parseIdent
518− let parseNamedBinder = NamedBinder name <$> (at *> C.indented *> parseBinderAtom)
483+ let parseNamedBinder = NamedBinder name <$> (at *> indented *> parseBinderNoParens)
519 parseNamedBinder <|> return (VarBinder name)
484 parseNamedBinder <|> return (VarBinder name)
520
485
521parseNullBinder :: TokenParser Binder
486parseNullBinder :: TokenParser Binder
@@ -528,11 +493,9 @@ parseIdentifierAndBinder =
528 return (mkString name, b)
493 return (mkString name, b)
529 <|> (,) <$> stringLiteral <*> rest
494 <|> (,) <$> stringLiteral <*> rest
530 where
495 where
531− rest = C.indented *> colon *> C.indented *> parseBinder
496+ rest = indented *> colon *> indented *> parseBinder
532
497
533−-- |
534−-- Parse a binder
498+-- | Parse a binder
535−--
536parseBinder :: TokenParser Binder
499parseBinder :: TokenParser Binder
537parseBinder =
500parseBinder =
538 withSourceSpan
501 withSourceSpan
@@ -543,7 +506,7 @@ parseBinder =
543 )
506 )
544 where
507 where
545 operators =
508 operators =
546− [ [ P.Infix (P.try (C.indented *> parseOpBinder P.<?> "binder operator") >>= \op ->
509+ [ [ P.Infix (P.try (indented *> parseOpBinder P.<?> "binder operator") >>= \op ->
547 return (BinaryNoParensBinder op)) P.AssocRight
510 return (BinaryNoParensBinder op)) P.AssocRight
548 ]
511 ]
549 ]
512 ]
@@ -569,9 +532,7 @@ parseBinderAtom = P.choice
569 , ParensInBinder <$> parens parseBinder
532 , ParensInBinder <$> parens parseBinder
570 ] P.<?> "binder"
533 ] P.<?> "binder"
571
534
572−-- |
573−-- Parse a binder as it would appear in a top level declaration
535+-- | Parse a binder as it would appear in a top level declaration
574−--
575parseBinderNoParens :: TokenParser Binder
536parseBinderNoParens :: TokenParser Binder
576parseBinderNoParens = P.choice
537parseBinderNoParens = P.choice
577 [ parseNullBinder
538 [ parseNullBinder
@@ -586,8 +547,6 @@ parseBinderNoParens = P.choice
586 , ParensInBinder <$> parens parseBinder
547 , ParensInBinder <$> parens parseBinder
587 ] P.<?> "binder"
548 ] P.<?> "binder"
588
549
589−-- |
590−-- Parse a guard
550+-- | Parse a guard
591−--
592parseGuard :: TokenParser Guard
551parseGuard :: TokenParser Guard
593−parseGuard = pipe *> C.indented *> parseValue
552+parseGuard = pipe *> indented *> parseValue