@@ -21,68 +21,67 @@ import PureScript.Values
21import qualified PureScript.Parser.Common as C
21import qualified PureScript.Parser.Common as C
22import Control.Applicative
22import Control.Applicative
23import qualified Text.Parsec as P
23import qualified Text.Parsec as P
24−import qualified Text.Parsec.Indent as I
25import Text.Parsec.Expr
24import Text.Parsec.Expr
26import Control.Monad
25import Control.Monad
27import Control.Arrow (Arrow(..))
26import Control.Arrow (Arrow(..))
28import PureScript.Parser.Types
27import PureScript.Parser.Types
29import PureScript.Types
28import PureScript.Types
31−booleanLiteral :: I.IndentParser String () Bool
30+booleanLiteral :: P.Parsec String P.Column Bool
32booleanLiteral = (C.reserved "true" >> return True) P.<|> (C.reserved "false" >> return False)
31booleanLiteral = (C.reserved "true" >> return True) P.<|> (C.reserved "false" >> return False)
34−parseNumericLiteral :: I.IndentParser String () Value
33+parseNumericLiteral :: P.Parsec String P.Column Value
35−parseNumericLiteral = NumericLiteral <$> C.signedNumber
34+parseNumericLiteral = NumericLiteral <$> C.integerOrFloat
37−parseStringLiteral :: I.IndentParser String () Value
36+parseStringLiteral :: P.Parsec String P.Column Value
38parseStringLiteral = StringLiteral <$> C.stringLiteral
37parseStringLiteral = StringLiteral <$> C.stringLiteral
40−parseBooleanLiteral :: I.IndentParser String () Value
39+parseBooleanLiteral :: P.Parsec String P.Column Value
41parseBooleanLiteral = BooleanLiteral <$> booleanLiteral
40parseBooleanLiteral = BooleanLiteral <$> booleanLiteral
43−parseArrayLiteral :: I.IndentParser String () Value
42+parseArrayLiteral :: P.Parsec String P.Column Value
44−parseArrayLiteral = ArrayLiteral <$> (C.squares $ C.commaSep parseValue)
43+parseArrayLiteral = ArrayLiteral <$> (C.squares $ parseValue `P.sepBy` (C.indented *> C.comma))
46−parseObjectLiteral :: I.IndentParser String () Value
45+parseObjectLiteral :: P.Parsec String P.Column Value
47−parseObjectLiteral = ObjectLiteral <$> (C.braces $ C.commaSep parseIdentifierAndValue)
46+parseObjectLiteral = ObjectLiteral <$> (C.braces $ parseIdentifierAndValue `P.sepBy` (C.indented *> C.comma))
49−parseIdentifierAndValue :: I.IndentParser String () (String, Value)
48+parseIdentifierAndValue :: P.Parsec String P.Column (String, Value)
50−parseIdentifierAndValue = do
49+parseIdentifierAndValue = (,) <$> (C.indented *> C.identifier <* C.indented <* C.colon)
51− name <- C.lexeme C.identifier
53− value <- parseValue
50+ <*> (C.indented *> parseValue)
56−parseAbs :: I.IndentParser String () Value
52+parseAbs :: P.Parsec String P.Column Value
57parseAbs = do
53parseAbs = do
58 C.lexeme $ P.char '\\'
54 C.lexeme $ P.char '\\'
59− args <- C.commaSep C.parseIdent
55+ args <- (C.indented *> C.parseIdent) `P.sepBy` (C.indented *> C.comma)
60− C.lexeme $ P.string "->"
56+ C.lexeme $ C.indented *> P.string "->"
61 value <- parseValue
57 value <- parseValue
62 return $ Abs args value
58 return $ Abs args value
64−parseApp :: I.IndentParser String () Value
60+parseApp :: P.Parsec String P.Column Value
65parseApp = App <$> parseValue
61parseApp = App <$> parseValue
66− <*> (C.parens $ C.commaSep parseValue)
62+ <*> (C.indented *> C.parens (parseValue `P.sepBy` (C.indented *> C.comma)))
68−parseVar :: I.IndentParser String () Value
64+parseVar :: P.Parsec String P.Column Value
69parseVar = Var <$> C.parseIdent
65parseVar = Var <$> C.parseIdent
71−parseConstructor :: I.IndentParser String () Value
67+parseConstructor :: P.Parsec String P.Column Value
72parseConstructor = Constructor <$> C.properName
68parseConstructor = Constructor <$> C.properName
74−parseCase :: I.IndentParser String () Value
70+parseCase :: P.Parsec String P.Column Value
75−parseCase = Case <$> P.between (C.reserved "case") (C.reserved "of") parseValue
71+parseCase = Case <$> (P.between (C.reserved "case") (C.indented *> C.reserved "of") parseValue)
76− <*> I.withPos (C.indentedBlock parseCaseAlternative)
72+ <*> (C.indented *> C.mark (P.many (C.same *> C.mark parseCaseAlternative)))
78−parseCaseAlternative :: I.IndentParser String () (Binder, Value)
74+parseCaseAlternative :: P.Parsec String P.Column (Binder, Value)
79parseCaseAlternative = (,) <$> (parseBinder <* C.lexeme (P.string "->")) <*> parseValue
75parseCaseAlternative = (,) <$> (parseBinder <* C.lexeme (P.string "->")) <*> parseValue
81−parseBlock :: I.IndentParser String () Value
77+parseBlock :: P.Parsec String P.Column Value
82−parseBlock = Block <$> (C.braces $ I.withPos $ C.indentedBlock $ parseStatement True)
78+parseBlock = Block <$> (C.reserved "do" *> parseManyStatements)
84−parseValueAtom :: I.IndentParser String () Value
80+parseManyStatements :: P.Parsec String P.Column [Statement]
81+parseManyStatements = C.indented *> (C.mark $ P.many $ C.same *> C.mark parseStatement)
83+parseValueAtom :: P.Parsec String P.Column Value
85−parseValueAtom = P.choice $ map P.try
84+parseValueAtom = C.indented *> P.choice (map P.try
86 [ parseNumericLiteral
85 [ parseNumericLiteral
87 , parseStringLiteral
86 , parseStringLiteral
88 , parseBooleanLiteral
87 , parseBooleanLiteral
@@ -93,125 +92,128 @@ parseValueAtom = P.choice $ map P.try
93 , parseConstructor
92 , parseConstructor
94 , parseBlock
93 , parseBlock
95 , parseCase
94 , parseCase
96− , C.parens parseValue ]
95+ , C.parens parseValue ])
98−parseValue :: I.IndentParser String () Value
97+parseValue :: P.Parsec String P.Column Value
99parseValue = buildExpressionParser operators $ C.fold (C.lexeme typedValue) (C.lexeme funArgs) App
98parseValue = buildExpressionParser operators $ C.fold (C.lexeme typedValue) (C.lexeme funArgs) App
101 typedValue = C.augment parseValueAtom parseTypeAnnotation TypedValue
100 typedValue = C.augment parseValueAtom parseTypeAnnotation TypedValue
102− funArgs = C.parens $ C.commaSep parseValue
101+ funArgs = C.indented *> C.parens (parseValue `P.sepBy` (C.indented *> C.comma))
103− parseTypeAnnotation = C.lexeme (P.string "::") *> parsePolyType
102+ parseTypeAnnotation = P.try $ C.lexeme (C.indented *> P.string "::") *> parsePolyType
104− operators = [ [ Postfix $ Accessor <$> (C.dot *> C.identifier)
103+ operators = [ [ Postfix $ Accessor <$> (C.indented *> C.dot *> C.indented *> C.identifier)
105− , Postfix $ Indexer <$> C.squares parseValue ]
104+ , Postfix $ Indexer <$> (C.indented *> C.squares parseValue) ]
106− , [ Prefix $ C.lexeme (P.try $ C.reservedOp "!") >> return (Unary Not)
105+ , [ Prefix $ C.lexeme (P.try $ C.indented *> C.reservedOp "!") >> return (Unary Not)
107− , Prefix $ C.lexeme (P.try $ C.reservedOp "~") >> return (Unary BitwiseNot)
106+ , Prefix $ C.lexeme (P.try $ C.indented *> C.reservedOp "~") >> return (Unary BitwiseNot)
108− , Prefix $ C.lexeme (P.try $ C.reservedOp "-") >> return (Unary Negate) ]
107+ , Prefix $ C.lexeme (P.try $ C.indented *> C.reservedOp "-") >> return (Unary Negate) ]
109− , [ Infix (C.lexeme (P.try C.parseIdentInfix >>= \ident -> return $ \t1 t2 -> App (App (Var ident) [t1]) [t2])) AssocRight ]
108+ , [ Infix (C.lexeme (P.try (C.indented *> C.parseIdentInfix) >>= \ident -> return $ \t1 t2 -> App (App (Var ident) [t1]) [t2])) AssocRight ]
110− , [ Infix (C.lexeme (P.try $ C.reservedOp "<=") >> return (Binary LessThanOrEqualTo)) AssocRight
109+ , [ Infix (C.lexeme (P.try $ C.indented *> C.reservedOp "<=") >> return (Binary LessThanOrEqualTo)) AssocRight
111− , Infix (C.lexeme (P.try $ C.reservedOp ">=") >> return (Binary GreaterThanOrEqualTo)) AssocRight ]
110+ , Infix (C.lexeme (P.try $ C.indented *> C.reservedOp ">=") >> return (Binary GreaterThanOrEqualTo)) AssocRight ]
112− , [ Infix (C.lexeme (P.try $ C.reservedOp "<") >> return (Binary LessThan)) AssocRight
111+ , [ Infix (C.lexeme (P.try $ C.indented *> C.reservedOp "<") >> return (Binary LessThan)) AssocRight
113− , Infix (C.lexeme (P.try $ C.reservedOp ">") >> return (Binary GreaterThan)) AssocRight ]
112+ , Infix (C.lexeme (P.try $ C.indented *> C.reservedOp ">") >> return (Binary GreaterThan)) AssocRight ]
114− , [ Infix (C.lexeme (P.try $ C.reservedOp "*") >> return (Binary Multiply)) AssocRight
113+ , [ Infix (C.lexeme (P.try $ C.indented *> C.reservedOp "*") >> return (Binary Multiply)) AssocRight
115− , Infix (C.lexeme (P.try $ C.reservedOp "/") >> return (Binary Divide)) AssocRight
114+ , Infix (C.lexeme (P.try $ C.indented *> C.reservedOp "/") >> return (Binary Divide)) AssocRight
116− , Infix (C.lexeme (P.try $ C.reservedOp "%") >> return (Binary Modulus)) AssocRight ]
115+ , Infix (C.lexeme (P.try $ C.indented *> C.reservedOp "%") >> return (Binary Modulus)) AssocRight ]
117− , [ Infix (C.lexeme (P.try $ C.reservedOp "++") >> return (Binary Concat)) AssocRight
116+ , [ Infix (C.lexeme (P.try $ C.indented *> C.reservedOp "++") >> return (Binary Concat)) AssocRight
118− , Infix (C.lexeme (P.try $ C.reservedOp "+") >> return (Binary Add)) AssocRight
117+ , Infix (C.lexeme (P.try $ C.indented *> C.reservedOp "+") >> return (Binary Add)) AssocRight
119− , Infix (C.lexeme (P.try $ C.reservedOp "-") >> return (Binary Subtract)) AssocRight ]
118+ , Infix (C.lexeme (P.try $ C.indented *> C.reservedOp "-") >> return (Binary Subtract)) AssocRight ]
120− , [ Infix (C.lexeme (P.try $ C.reservedOp "<<") >> return (Binary ShiftLeft)) AssocRight
119+ , [ Infix (C.lexeme (P.try $ C.indented *> C.reservedOp "<<") >> return (Binary ShiftLeft)) AssocRight
121− , Infix (C.lexeme (P.try $ C.reservedOp ">>>") >> return (Binary ZeroFillShiftRight)) AssocRight
120+ , Infix (C.lexeme (P.try $ C.indented *> C.reservedOp ">>>") >> return (Binary ZeroFillShiftRight)) AssocRight
122− , Infix (C.lexeme (P.try $ C.reservedOp ">>") >> return (Binary ShiftRight)) AssocRight ]
121+ , Infix (C.lexeme (P.try $ C.indented *> C.reservedOp ">>") >> return (Binary ShiftRight)) AssocRight ]
123− , [ Infix (C.lexeme (P.try $ C.reservedOp "==") >> return (Binary EqualTo)) AssocRight
122+ , [ Infix (C.lexeme (P.try $ C.indented *> C.reservedOp "==") >> return (Binary EqualTo)) AssocRight
124− , Infix (C.lexeme (P.try $ C.reservedOp "!=") >> return (Binary NotEqualTo)) AssocRight ]
123+ , Infix (C.lexeme (P.try $ C.indented *> C.reservedOp "!=") >> return (Binary NotEqualTo)) AssocRight ]
125− , [ Infix (C.lexeme (P.try $ C.reservedOp "&") >> return (Binary BitwiseAnd)) AssocRight ]
124+ , [ Infix (C.lexeme (P.try $ C.indented *> C.reservedOp "&") >> return (Binary BitwiseAnd)) AssocRight ]
126− , [ Infix (C.lexeme (P.try $ C.reservedOp "^") >> return (Binary BitwiseXor)) AssocRight ]
125+ , [ Infix (C.lexeme (P.try $ C.indented *> C.reservedOp "^") >> return (Binary BitwiseXor)) AssocRight ]
127− , [ Infix (C.lexeme (P.try $ C.reservedOp "|") >> return (Binary BitwiseOr)) AssocRight ]
126+ , [ Infix (C.lexeme (P.try $ C.indented *> C.reservedOp "|") >> return (Binary BitwiseOr)) AssocRight ]
128− , [ Infix (C.lexeme (P.try $ C.reservedOp "&&") >> return (Binary And)) AssocRight ]
127+ , [ Infix (C.lexeme (P.try $ C.indented *> C.reservedOp "&&") >> return (Binary And)) AssocRight ]
129− , [ Infix (C.lexeme (P.try $ C.reservedOp "||") >> return (Binary Or)) AssocRight ]
128+ , [ Infix (C.lexeme (P.try $ C.indented *> C.reservedOp "||") >> return (Binary Or)) AssocRight ]
132−parseVariableIntroduction :: Bool -> I.IndentParser String () Statement
131+parseVariableIntroduction :: P.Parsec String P.Column Statement
133−parseVariableIntroduction requireSemi = do
132+parseVariableIntroduction = do
134 C.reserved "var"
133 C.reserved "var"
135− name <- C.parseIdent
134+ name <- C.indented *> C.parseIdent
136− C.lexeme $ P.char '='
135+ C.lexeme $ C.indented *> P.char '='
137 value <- parseValue
136 value <- parseValue
138− when requireSemi (void C.semi)
139 return $ VariableIntroduction name value
137 return $ VariableIntroduction name value
141−parseAssignment :: Bool -> I.IndentParser String () (Statement)
139+parseAssignment :: P.Parsec String P.Column Statement
142−parseAssignment requireSemi = do
140+parseAssignment = do
143 tgt <- parseAssignmentTarget
141 tgt <- parseAssignmentTarget
144− C.lexeme $ P.char '='
142+ C.lexeme $ C.indented *> P.char '='
145 value <- parseValue
143 value <- parseValue
146− when requireSemi (void C.semi)
147 return $ Assignment tgt value
144 return $ Assignment tgt value
149−parseManyStatements :: I.IndentParser String () [Statement]
150−parseManyStatements = C.braces $ I.withPos $ C.indentedBlock $ parseStatement True
152−parseWhile :: I.IndentParser String () Statement
146+parseWhile :: P.Parsec String P.Column Statement
153−parseWhile = While <$> (C.reserved "while" *> C.parens parseValue)
147+parseWhile = While <$> (C.reserved "while" *> C.indented *> parseValue <* C.indented <* C.colon)
154 <*> parseManyStatements
148 <*> parseManyStatements
156−parseFor :: I.IndentParser String () Statement
150+parseFor :: P.Parsec String P.Column Statement
157−parseFor = For <$> (C.reserved "for" *> C.parens forIntro)
151+parseFor = For <$> (C.reserved "for" *> C.indented *> C.parens forIntro <* C.indented <* C.colon)
158 <*> parseManyStatements
152 <*> parseManyStatements
160− forIntro = (,,) <$> parseStatement False
154+ forIntro = (,,) <$> (C.indented *> parseStatement)
161− <*> (C.semi *> parseValue)
155+ <*> (C.indented *> C.semi *> C.indented *> parseValue)
162− <*> (C.semi *> parseStatement False)
156+ <*> (C.indented *> C.semi *> C.indented *> parseStatement)
164−parseIfThenElse :: I.IndentParser String () Statement
158+parseIf :: P.Parsec String P.Column Statement
165−parseIfThenElse = IfThenElse
159+parseIf = If <$> parseIfStatement
161+parseIfStatement :: P.Parsec String P.Column IfStatement
166− <$> (C.reserved "if" *> C.parens parseValue)
163+ IfStatement <$> (C.reserved "if" *> C.indented *> parseValue <* C.indented <* C.colon)
167− <*> parseManyStatements
164+ <*> parseManyStatements
165+ <*> P.optionMaybe (C.same *> parseElseStatement)
167+parseElseStatement :: P.Parsec String P.Column ElseStatement
168+parseElseStatement = C.reserved "else" >> (ElseIf <$> (C.indented *> parseIfStatement)
168− <*> P.optionMaybe (C.reserved "else" *> parseManyStatements)
169+ <|> Else <$> (C.indented *> C.colon *> parseManyStatements))
170−parseReturn :: Bool -> I.IndentParser String () Statement
171+parseReturn :: P.Parsec String P.Column Statement
171−parseReturn requireSemi = Return <$> (C.reserved "return" *> parseValue <* when requireSemi (void C.semi))
172+parseReturn = Return <$> (C.reserved "return" *> parseValue)
173−parseStatement :: Bool -> I.IndentParser String () Statement
174+parseStatement :: P.Parsec String P.Column Statement
174−parseStatement requireSemi = P.choice $ map P.try
175+parseStatement = P.choice (map P.try
175− [ parseVariableIntroduction requireSemi
176+ [ parseVariableIntroduction
176− , parseAssignment requireSemi
177+ , parseAssignment
177 , parseWhile
178 , parseWhile
178 , parseFor
179 , parseFor
179− , parseIfThenElse
180+ , parseIf
180− , parseReturn requireSemi ]
181+ , parseReturn ])
182−parseStringBinder :: I.IndentParser String () Binder
183+parseStringBinder :: P.Parsec String P.Column Binder
183parseStringBinder = StringBinder <$> C.stringLiteral
184parseStringBinder = StringBinder <$> C.stringLiteral
185−parseBooleanBinder :: I.IndentParser String () Binder
186+parseBooleanBinder :: P.Parsec String P.Column Binder
186parseBooleanBinder = BooleanBinder <$> booleanLiteral
187parseBooleanBinder = BooleanBinder <$> booleanLiteral
188−parseNumberBinder :: I.IndentParser String () Binder
189+parseNumberBinder :: P.Parsec String P.Column Binder
189−parseNumberBinder = NumberBinder <$> C.signedNumber
190+parseNumberBinder = NumberBinder <$> C.integerOrFloat
191−parseVarBinder :: I.IndentParser String () Binder
192+parseVarBinder :: P.Parsec String P.Column Binder
192parseVarBinder = VarBinder <$> C.parseIdent
193parseVarBinder = VarBinder <$> C.parseIdent
194−parseNullaryBinder :: I.IndentParser String () Binder
195+parseNullaryBinder :: P.Parsec String P.Column Binder
195parseNullaryBinder = NullaryBinder <$> C.lexeme C.properName
196parseNullaryBinder = NullaryBinder <$> C.lexeme C.properName
197−parseUnaryBinder :: I.IndentParser String () Binder
198+parseUnaryBinder :: P.Parsec String P.Column Binder
198−parseUnaryBinder = UnaryBinder <$> C.lexeme C.properName <*> parseBinder
199+parseUnaryBinder = UnaryBinder <$> C.lexeme C.properName <*> (C.indented *> parseBinder)
200−parseObjectBinder :: I.IndentParser String () Binder
201+parseObjectBinder :: P.Parsec String P.Column Binder
201−parseObjectBinder = ObjectBinder <$> C.braces (C.commaSep parseIdentifierAndBinder)
202+parseObjectBinder = ObjectBinder <$> C.braces ((C.indented *> parseIdentifierAndBinder) `P.sepBy` (C.indented *> C.comma))
203−parseArrayBinder :: I.IndentParser String () Binder
204+parseArrayBinder :: P.Parsec String P.Column Binder
204−parseArrayBinder = C.squares $ ArrayBinder <$> (C.commaSep parseBinder) <*> P.optionMaybe (C.colon *> parseBinder)
205+parseArrayBinder = C.squares $ ArrayBinder <$> ((C.indented *> parseBinder) `P.sepBy` (C.indented *> C.comma))
206+ <*> P.optionMaybe (C.indented *> C.colon *> C.indented *> parseBinder)
206−parseIdentifierAndBinder :: I.IndentParser String () (String, Binder)
208+parseIdentifierAndBinder :: P.Parsec String P.Column (String, Binder)
207parseIdentifierAndBinder = do
209parseIdentifierAndBinder = do
208 name <- C.lexeme C.identifier
210 name <- C.lexeme C.identifier
209− C.lexeme $ P.char '='
211+ C.lexeme $ C.indented *> P.char '='
210− binder <- parseBinder
212+ binder <- C.indented *> parseBinder
211 return (name, binder)
213 return (name, binder)
213−parseBinder :: I.IndentParser String () Binder
215+parseBinder :: P.Parsec String P.Column Binder
214−parseBinder = P.choice $ map P.try
216+parseBinder = P.choice (map P.try
215 [ parseStringBinder
217 [ parseStringBinder
216 , parseBooleanBinder
218 , parseBooleanBinder
217 , parseNumberBinder
219 , parseNumberBinder
@@ -220,10 +222,10 @@ parseBinder = P.choice $ map P.try
220 , parseNullaryBinder
222 , parseNullaryBinder
221 , parseObjectBinder
223 , parseObjectBinder
222 , parseArrayBinder
224 , parseArrayBinder
223− , C.parens parseBinder ]
225+ , C.parens parseBinder ])
225−parseAssignmentTarget :: I.IndentParser String () AssignmentTarget
227+parseAssignmentTarget :: P.Parsec String P.Column AssignmentTarget
226parseAssignmentTarget = buildExpressionParser operators (AssignVariable <$> C.parseIdent)
228parseAssignmentTarget = buildExpressionParser operators (AssignVariable <$> C.parseIdent)
228− operators = [ [ Postfix $ AssignArrayIndex <$> C.squares parseValue
230+ operators = [ [ Postfix $ AssignArrayIndex <$> (C.indented *> C.squares parseValue)
229− , Postfix $ AssignObjectProperty <$> (C.dot *> C.identifier) ] ]
231+ , Postfix $ AssignObjectProperty <$> (C.indented *> C.dot *> C.indented *> C.identifier) ] ]