@@ -33,6 +33,7 @@ import Language.PureScript.Environment
33import Language.PureScript.Errors
33import Language.PureScript.Errors
34import Language.PureScript.Kinds
34import Language.PureScript.Kinds
35import Language.PureScript.Names
35import Language.PureScript.Names
36+import Language.PureScript.Types
36import Language.PureScript.Parser.Common
37import Language.PureScript.Parser.Common
37import Language.PureScript.Parser.Kinds
38import Language.PureScript.Parser.Kinds
38import Language.PureScript.Parser.Lexer
39import Language.PureScript.Parser.Lexer
@@ -75,7 +76,7 @@ parseTypeDeclaration =
76parseTypeSynonymDeclaration :: TokenParser Declaration
77parseTypeSynonymDeclaration :: TokenParser Declaration
77parseTypeSynonymDeclaration =
78parseTypeSynonymDeclaration =
78− TypeSynonymDeclaration <$> (P.try (reserved "type") *> indented *> properName)
79+ TypeSynonymDeclaration <$> (reserved "type" *> indented *> properName)
79 <*> many (indented *> kindedIdent)
80 <*> many (indented *> kindedIdent)
80 <*> (indented *> equals *> noWildcards parsePolyType)
81 <*> (indented *> equals *> noWildcards parsePolyType)
@@ -101,21 +102,18 @@ parseValueDeclaration = do
101 return $ maybe value (`Let` value) whereClause
102 return $ maybe value (`Let` value) whereClause
103parseExternDeclaration :: TokenParser Declaration
104parseExternDeclaration :: TokenParser Declaration
104−parseExternDeclaration = P.try (reserved "foreign") *> indented *> reserved "import" *> indented *>
105+parseExternDeclaration = reserved "foreign" *> indented *> reserved "import" *> indented *>
105− (ExternDataDeclaration <$> (P.try (reserved "data") *> indented *> properName)
106+ (ExternDataDeclaration <$> (reserved "data" *> indented *> properName)
106 <*> (indented *> doubleColon *> parseKind)
107 <*> (indented *> doubleColon *> parseKind)
107 <|> (do ident <- parseIdent
108 <|> (do ident <- parseIdent
108− -- TODO: add a wiki page link with migration info
109− -- TODO: remove this deprecation warning in 0.8
110− _ <- P.optional $ stringLiteral *> featureWasRemoved "Inline foreign string literals are no longer supported."
111 ty <- indented *> doubleColon *> noWildcards parsePolyType
109 ty <- indented *> doubleColon *> noWildcards parsePolyType
112 return $ ExternDeclaration ident ty))
110 return $ ExternDeclaration ident ty))
114parseAssociativity :: TokenParser Associativity
112parseAssociativity :: TokenParser Associativity
115parseAssociativity =
113parseAssociativity =
116− (P.try (reserved "infixl") >> return Infixl) <|>
114+ (reserved "infixl" *> return Infixl) <|>
117− (P.try (reserved "infixr") >> return Infixr) <|>
115+ (reserved "infixr" *> return Infixr) <|>
118− (P.try (reserved "infix") >> return Infix)
116+ (reserved "infix" *> return Infix)
120parseFixity :: TokenParser Fixity
118parseFixity :: TokenParser Fixity
121parseFixity = Fixity <$> parseAssociativity <*> (indented *> natural)
119parseFixity = Fixity <$> parseAssociativity <*> (indented *> natural)
@@ -124,8 +122,9 @@ parseFixityDeclaration :: TokenParser Declaration
124parseFixityDeclaration = do
122parseFixityDeclaration = do
125 fixity <- parseFixity
123 fixity <- parseFixity
125+ alias <- P.optionMaybe $ (Ident <$> identifier) <* reserved "as"
127 name <- symbol
126 name <- symbol
128− return $ FixityDeclaration fixity name
127+ return $ FixityDeclaration fixity name alias
130parseImportDeclaration :: TokenParser Declaration
129parseImportDeclaration :: TokenParser Declaration
131parseImportDeclaration = do
130parseImportDeclaration = do
@@ -152,9 +151,10 @@ parseImportDeclaration' = do
152 qName <- qualifiedName
151 qName <- qualifiedName
153 return (moduleName', declType, Just qName, True)
152 return (moduleName', declType, Just qName, True)
154 qualifyingList expectedType = do
153 qualifyingList expectedType = do
154+ declType <- P.optionMaybe
155− idents <- P.optionMaybe $ indented *> parens (commaSep parseDeclarationRef)
155+ $ P.try (expectedType <$> (indented *> parens (commaSep parseDeclarationRef)))
156− return $ fromMaybe Implicit (expectedType <$> idents)
156+ <|> (const (Implicit True) <$> (indented *> parens (symbol' "..")))
157−
157+ return $ fromMaybe (Implicit False) declType
159parseDeclarationRef :: TokenParser DeclarationRef
159parseDeclarationRef :: TokenParser DeclarationRef
160parseDeclarationRef =
160parseDeclarationRef =
@@ -172,9 +172,9 @@ parseDeclarationRef =
172parseTypeClassDeclaration :: TokenParser Declaration
172parseTypeClassDeclaration :: TokenParser Declaration
173parseTypeClassDeclaration = do
173parseTypeClassDeclaration = do
174 reserved "class"
174 reserved "class"
175− implies <- P.option [] $ do
175+ implies <- P.option [] . P.try $ do
177− implies <- parens (commaSep1 ((,) <$> parseQualified properName <*> P.many (noWildcards parseTypeAtom)))
177+ implies <- (return <$> parseConstraint) <|> parens (commaSep1 parseConstraint)
178 lfatArrow
178 lfatArrow
179 return implies
179 return implies
180 className <- indented *> properName
180 className <- indented *> properName
@@ -183,13 +183,17 @@ parseTypeClassDeclaration = do
183 indented *> reserved "where"
183 indented *> reserved "where"
184 indented *> mark (P.many (same *> positioned parseTypeDeclaration))
184 indented *> mark (P.many (same *> positioned parseTypeDeclaration))
185 return $ TypeClassDeclaration className idents implies members
185 return $ TypeClassDeclaration className idents implies members
188+parseConstraint :: TokenParser Constraint
189+parseConstraint = (,) <$> parseQualified properName <*> P.many (noWildcards parseTypeAtom)
187parseInstanceDeclaration :: TokenParser (TypeInstanceBody -> Declaration)
191parseInstanceDeclaration :: TokenParser (TypeInstanceBody -> Declaration)
188parseInstanceDeclaration = do
192parseInstanceDeclaration = do
189 reserved "instance"
193 reserved "instance"
190 name <- parseIdent <* indented <* doubleColon
194 name <- parseIdent <* indented <* doubleColon
191− deps <- P.optionMaybe $ do
195+ deps <- P.optionMaybe $ P.try $ do
192− deps <- parens (commaSep1 ((,) <$> parseQualified properName <*> P.many (noWildcards parseTypeAtom)))
196+ deps <- (return <$> parseConstraint) <|> parens (commaSep1 parseConstraint)
194 rfatArrow
198 rfatArrow
195 return deps
199 return deps
@@ -321,11 +325,12 @@ parseIdentifierAndValue =
321 <|> (,) <$> (C.indented *> stringLiteral) <*> rest
325 <|> (,) <$> (C.indented *> stringLiteral) <*> rest
323 rest = C.indented *> colon *> C.indented *> val
327 rest = C.indented *> colon *> C.indented *> val
324− val = (Just <$> parseValue) <|> (underscore *> pure Nothing)
328+ val = (underscore *> pure Nothing) <|> (Just <$> parseValue)
326parseAbs :: TokenParser Expr
330parseAbs :: TokenParser Expr
327parseAbs = do
331parseAbs = do
328 symbol' "\\"
332 symbol' "\\"
333+ -- TODO: remove this 'try' after operator aliases are finished (0.9)
329 args <- P.many1 (C.indented *> (Abs <$> (Left <$> P.try C.parseIdent <|> Right <$> parseBinderNoParens)))
334 args <- P.many1 (C.indented *> (Abs <$> (Left <$> P.try C.parseIdent <|> Right <$> parseBinderNoParens)))
330 C.indented *> rarrow
335 C.indented *> rarrow
331 value <- parseValue
336 value <- parseValue
@@ -341,11 +346,11 @@ parseConstructor :: TokenParser Expr
341parseConstructor = Constructor <$> C.parseQualified C.properName
346parseConstructor = Constructor <$> C.parseQualified C.properName
343parseCase :: TokenParser Expr
348parseCase :: TokenParser Expr
344−parseCase = Case <$> P.between (P.try (reserved "case")) (C.indented *> reserved "of") (return <$> parseValue)
349+parseCase = Case <$> P.between (reserved "case") (C.indented *> reserved "of") (commaSep1 parseValue)
345 <*> (C.indented *> C.mark (P.many1 (C.same *> C.mark parseCaseAlternative)))
350 <*> (C.indented *> C.mark (P.many1 (C.same *> C.mark parseCaseAlternative)))
347parseCaseAlternative :: TokenParser CaseAlternative
352parseCaseAlternative :: TokenParser CaseAlternative
348−parseCaseAlternative = CaseAlternative <$> (return <$> parseBinder)
353+parseCaseAlternative = CaseAlternative <$> (commaSep1 parseBinder)
349 <*> (Left <$> (C.indented *>
354 <*> (Left <$> (C.indented *>
350 P.many1 ((,) <$> parseGuard
355 P.many1 ((,) <$> parseGuard
351 <*> (indented *> rarrow *> parseValue)
356 <*> (indented *> rarrow *> parseValue)
@@ -370,23 +375,25 @@ parseLet = do
371parseValueAtom :: TokenParser Expr
376parseValueAtom :: TokenParser Expr
372parseValueAtom = P.choice
377parseValueAtom = P.choice
373− [ P.try parseNumericLiteral
378+ [ parseNumericLiteral
374− , P.try parseCharLiteral
379+ , parseCharLiteral
375− , P.try parseStringLiteral
380+ , parseStringLiteral
376− , P.try parseBooleanLiteral
381+ , parseBooleanLiteral
377− , parseArrayLiteral
382+ , parseArrayLiteral
378− , P.try parseObjectLiteral
383+ , P.try parseObjectLiteral
379− , P.try parseObjectGetter
384+ , P.try parseObjectGetter
380− , parseAbs
385+ , parseAbs
381− , P.try parseConstructor
386+ , P.try parseConstructor
382− , P.try parseVar
387+ , P.try parseVar
383− , parseCase
388+ , parseCase
384− , parseIfThenElse
389+ , parseIfThenElse
385− , parseDo
390+ , parseDo
386− , parseLet
391+ , parseLet
387− , P.try $ Parens <$> parens parseValue
392+ , P.try $ Parens <$> parens parseValue
388− , parseOperatorSection
393+ , parseOperatorSection
394+ -- TODO: combine this with parseObjectGetter
389− , P.try parseObjectUpdaterWildcard ]
395+ , parseObjectUpdaterWildcard
392-- Parse an expression in backticks or an operator
399-- Parse an expression in backticks or an operator
@@ -422,13 +429,14 @@ parseDoNotationLet :: TokenParser DoNotationElement
422parseDoNotationLet = DoNotationLet <$> (reserved "let" *> C.indented *> C.mark (P.many1 (C.same *> parseLocalDeclaration)))
429parseDoNotationLet = DoNotationLet <$> (reserved "let" *> C.indented *> C.mark (P.many1 (C.same *> parseLocalDeclaration)))
424parseDoNotationBind :: TokenParser DoNotationElement
431parseDoNotationBind :: TokenParser DoNotationElement
425−parseDoNotationBind = DoNotationBind <$> parseBinder <*> (C.indented *> larrow *> parseValue)
432+parseDoNotationBind = DoNotationBind <$> P.try (parseBinder <* C.indented <* larrow) <*> parseValue
427parseDoNotationElement :: TokenParser DoNotationElement
434parseDoNotationElement :: TokenParser DoNotationElement
428parseDoNotationElement = P.choice
435parseDoNotationElement = P.choice
429− [ P.try parseDoNotationBind
436+ [ parseDoNotationBind
430 , parseDoNotationLet
437 , parseDoNotationLet
431− , P.try (DoNotationValue <$> parseValue) ]
438+ , DoNotationValue <$> parseValue
433parseObjectGetter :: TokenParser Expr
441parseObjectGetter :: TokenParser Expr
434parseObjectGetter = ObjectGetter <$> (underscore *> C.indented *> dot *> C.indented *> (lname <|> stringLiteral))
442parseObjectGetter = ObjectGetter <$> (underscore *> C.indented *> dot *> C.indented *> (lname <|> stringLiteral))
@@ -438,7 +446,8 @@ indexersAndAccessors :: TokenParser Expr
438indexersAndAccessors = C.buildPostfixParser postfixTable parseValueAtom
446indexersAndAccessors = C.buildPostfixParser postfixTable parseValueAtom
440 postfixTable = [ parseAccessor
448 postfixTable = [ parseAccessor
441− , P.try . parseUpdaterBody . Just ]
449+ , P.try . parseUpdaterBody . Just
444-- Parse a value
453-- Parse a value
@@ -450,9 +459,9 @@ parseValue = withSourceSpan PositionedValue
450 $ indexersAndAccessors) P.<?> "expression"
459 $ indexersAndAccessors) P.<?> "expression"
452 postfixTable = [ \v -> P.try (flip App <$> (C.indented *> indexersAndAccessors)) <*> pure v
461 postfixTable = [ \v -> P.try (flip App <$> (C.indented *> indexersAndAccessors)) <*> pure v
453− , \v -> flip (TypedValue True) <$> (P.try (C.indented *> doubleColon) *> parsePolyType) <*> pure v
462+ , \v -> flip (TypedValue True) <$> (C.indented *> doubleColon *> parsePolyType) <*> pure v
455− operators = [ [ P.Prefix (P.try (C.indented *> symbol' "-") >> return UnaryMinus)
464+ operators = [ [ P.Prefix (C.indented *> symbol' "-" *> return UnaryMinus)
457 , [ P.Infix (P.try (C.indented *> parseInfixExpr P.<?> "infix expression") >>= \ident ->
466 , [ P.Infix (P.try (C.indented *> parseInfixExpr P.<?> "infix expression") >>= \ident ->
458 return (BinaryNoParens ident)) P.AssocRight
467 return (BinaryNoParens ident)) P.AssocRight
@@ -482,9 +491,6 @@ parseNumberBinder = NumberBinder <$> (sign <*> number)
482 <|> (symbol' "+" >> return id)
491 <|> (symbol' "+" >> return id)
483 <|> return id
492 <|> return id
485−parseVarBinder :: TokenParser Binder
486−parseVarBinder = VarBinder <$> C.parseIdent
488parseNullaryConstructorBinder :: TokenParser Binder
494parseNullaryConstructorBinder :: TokenParser Binder
489parseNullaryConstructorBinder = ConstructorBinder <$> C.parseQualified C.properName <*> pure []
495parseNullaryConstructorBinder = ConstructorBinder <$> C.parseQualified C.properName <*> pure []
@@ -497,9 +503,13 @@ parseObjectBinder = ObjectBinder <$> braces (commaSep (C.indented *> parseIdenti
497parseArrayBinder :: TokenParser Binder
503parseArrayBinder :: TokenParser Binder
498parseArrayBinder = squares $ ArrayBinder <$> commaSep (C.indented *> parseBinder)
504parseArrayBinder = squares $ ArrayBinder <$> commaSep (C.indented *> parseBinder)
500−parseNamedBinder :: TokenParser Binder
506+parseVarOrNamedBinder :: TokenParser Binder
507+parseVarOrNamedBinder = do
508+ -- TODO: once operator aliases are finalized in 0.9, this 'try' won't be needed
509+ -- any more since identifiers in binders won't be 'Op's.
510+ name <- P.try C.parseIdent
501−parseNamedBinder = NamedBinder <$> (C.parseIdent <* C.indented <* at)
511+ let parseNamedBinder = NamedBinder name <$> (at *> C.indented *> parseBinder)
502− <*> (C.indented *> parseBinder)
512+ parseNamedBinder <|> return (VarBinder name)
504parseNullBinder :: TokenParser Binder
514parseNullBinder :: TokenParser Binder
505parseNullBinder = underscore *> return NullBinder
515parseNullBinder = underscore *> return NullBinder
@@ -517,43 +527,41 @@ parseIdentifierAndBinder =
517-- Parse a binder
527-- Parse a binder
519parseBinder :: TokenParser Binder
529parseBinder :: TokenParser Binder
520−parseBinder = withSourceSpan PositionedBinder (P.buildExpressionParser operators (buildPostfixParser postfixTable parseBinderAtom))
530+parseBinder = withSourceSpan PositionedBinder (buildPostfixParser postfixTable parseBinderAtom)
522− -- TODO: remove this deprecation warning in 0.8
523− operators = [ [ P.Infix (P.try $ C.indented *> colon *> featureWasRemoved "Cons binders are no longer supported. Consider using purescript-lists or purescript-sequences instead.") P.AssocRight ] ]
524 -- TODO: parsePolyType when adding support for polymorphic types
532 -- TODO: parsePolyType when adding support for polymorphic types
525− postfixTable = [ \b -> flip TypedBinder b <$> (P.try (indented *> doubleColon) *> parseType)
533+ postfixTable = [ \b -> flip TypedBinder b <$> (indented *> doubleColon *> parseType)
527 parseBinderAtom :: TokenParser Binder
535 parseBinderAtom :: TokenParser Binder
528− parseBinderAtom = P.choice (map P.try
536+ parseBinderAtom = P.choice
529 [ parseNullBinder
537 [ parseNullBinder
530 , parseCharBinder
538 , parseCharBinder
531 , parseStringBinder
539 , parseStringBinder
532 , parseBooleanBinder
540 , parseBooleanBinder
533 , parseNumberBinder
541 , parseNumberBinder
534− , parseNamedBinder
542+ , parseVarOrNamedBinder
536 , parseConstructorBinder
543 , parseConstructorBinder
537 , parseObjectBinder
544 , parseObjectBinder
538 , parseArrayBinder
545 , parseArrayBinder
539− , parens parseBinder ]) P.<?> "binder"
546+ , parens parseBinder
542-- Parse a binder as it would appear in a top level declaration
550-- Parse a binder as it would appear in a top level declaration
544parseBinderNoParens :: TokenParser Binder
552parseBinderNoParens :: TokenParser Binder
545−parseBinderNoParens = P.choice (map P.try
553+parseBinderNoParens = P.choice
546− [ parseNullBinder
554+ [ parseNullBinder
547− , parseCharBinder
555+ , parseCharBinder
548− , parseStringBinder
556+ , parseStringBinder
549− , parseBooleanBinder
557+ , parseBooleanBinder
550− , parseNumberBinder
558+ , parseNumberBinder
551− , parseNamedBinder
559+ , parseVarOrNamedBinder
553− , parseNullaryConstructorBinder
560+ , parseNullaryConstructorBinder
554− , parseObjectBinder
561+ , parseObjectBinder
555− , parseArrayBinder
562+ , parseArrayBinder
556− , parens parseBinder ]) P.<?> "binder"
563+ , parens parseBinder
559-- Parse a guard
567-- Parse a guard