@@ -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
@@ -174,9 +175,9 @@ parseDeclarationRef =
174parseTypeClassDeclaration :: TokenParser Declaration
175parseTypeClassDeclaration :: TokenParser Declaration
175parseTypeClassDeclaration = do
176parseTypeClassDeclaration = do
176 reserved "class"
177 reserved "class"
177− implies <- P.option [] $ do
178+ implies <- P.option [] $ P.try $ do
179− implies <- parens (commaSep1 ((,) <$> parseQualified properName <*> P.many (noWildcards parseTypeAtom)))
180+ implies <- P.try (return <$> parseConstraint) <|> parens (commaSep1 parseConstraint)
180 lfatArrow
181 lfatArrow
181 return implies
182 return implies
182 className <- indented *> properName
183 className <- indented *> properName
@@ -185,13 +186,17 @@ parseTypeClassDeclaration = do
185 indented *> reserved "where"
186 indented *> reserved "where"
186 indented *> mark (P.many (same *> positioned parseTypeDeclaration))
187 indented *> mark (P.many (same *> positioned parseTypeDeclaration))
187 return $ TypeClassDeclaration className idents implies members
188 return $ TypeClassDeclaration className idents implies members
191+parseConstraint :: TokenParser Constraint
192+parseConstraint = (,) <$> parseQualified properName <*> P.many (noWildcards parseTypeAtom)
189parseInstanceDeclaration :: TokenParser (TypeInstanceBody -> Declaration)
194parseInstanceDeclaration :: TokenParser (TypeInstanceBody -> Declaration)
190parseInstanceDeclaration = do
195parseInstanceDeclaration = do
191 reserved "instance"
196 reserved "instance"
192 name <- parseIdent <* indented <* doubleColon
197 name <- parseIdent <* indented <* doubleColon
193− deps <- P.optionMaybe $ do
198+ deps <- P.optionMaybe $ P.try $ do
194− deps <- parens (commaSep1 ((,) <$> parseQualified properName <*> P.many (noWildcards parseTypeAtom)))
199+ deps <- P.try (return <$> parseConstraint) <|> parens (commaSep1 parseConstraint)
196 rfatArrow
201 rfatArrow
197 return deps
202 return deps