@@ -21,38 +21,39 @@ import PureScript.Values
2121import qualified PureScript.Parser.Common as C
2222import Control.Applicative
2323import qualified Text.Parsec as P
24+import qualified Text.Parsec.Indent as I
2425import Text.Parsec.Expr
2526import Control.Monad
2627import Control.Arrow (Arrow(..))
2728import PureScript.Parser.Types
2829import PureScript.Types
2930
30−booleanLiteral :: P.Parsec String () Bool
31+booleanLiteral :: I.IndentParser String () Bool
3132booleanLiteral = (C.reserved "true" >> return True) P.<|> (C.reserved "false" >> return False)
3233
33−parseNumericLiteral :: P.Parsec String () Value
34+parseNumericLiteral :: I.IndentParser String () Value
3435parseNumericLiteral = NumericLiteral <$> C.naturalOrFloat
3536
36−parseStringLiteral :: P.Parsec String () Value
37+parseStringLiteral :: I.IndentParser String () Value
3738parseStringLiteral = StringLiteral <$> C.stringLiteral
3839
39−parseBooleanLiteral :: P.Parsec String () Value
40+parseBooleanLiteral :: I.IndentParser String () Value
4041parseBooleanLiteral = BooleanLiteral <$> booleanLiteral
4142
42−parseArrayLiteral :: P.Parsec String () Value
43+parseArrayLiteral :: I.IndentParser String () Value
4344parseArrayLiteral = ArrayLiteral <$> (C.squares $ C.commaSep parseValue)
4445
45−parseObjectLiteral :: P.Parsec String () Value
46+parseObjectLiteral :: I.IndentParser String () Value
4647parseObjectLiteral = ObjectLiteral <$> (C.braces $ C.commaSep parseIdentifierAndValue)
4748
48−parseIdentifierAndValue :: P.Parsec String () (String, Value)
49+parseIdentifierAndValue :: I.IndentParser String () (String, Value)
4950parseIdentifierAndValue = do
5051 name <- C.lexeme C.identifier
5152 C.colon
5253 value <- parseValue
5354 return (name, value)
5455
55−parseAbs :: P.Parsec String () Value
56+parseAbs :: I.IndentParser String () Value
5657parseAbs = do
5758 C.lexeme $ P.char '\\'
5859 args <- C.commaSep C.parseIdent
@@ -60,27 +61,27 @@ parseAbs = do
6061 value <- parseValue
6162 return $ Abs args value
6263
63−parseApp :: P.Parsec String () Value
64+parseApp :: I.IndentParser String () Value
6465parseApp = App <$> parseValue
6566 <*> (C.parens $ C.commaSep parseValue)
6667
67−parseVar :: P.Parsec String () Value
68+parseVar :: I.IndentParser String () Value
6869parseVar = Var <$> C.parseIdent
6970
70−parseConstructor :: P.Parsec String () Value
71+parseConstructor :: I.IndentParser String () Value
7172parseConstructor = Constructor <$> C.properName
7273
73−parseCase :: P.Parsec String () Value
74+parseCase :: I.IndentParser String () Value
7475parseCase = Case <$> P.between (C.reserved "case") (C.reserved "of") parseValue
7576 <*> C.braces (C.semiSep parseCaseAlternative)
7677
77−parseCaseAlternative :: P.Parsec String () (Binder, Value)
78+parseCaseAlternative :: I.IndentParser String () (Binder, Value)
7879parseCaseAlternative = (,) <$> (parseBinder <* C.lexeme (P.string "->")) <*> parseValue
7980
80−parseBlock :: P.Parsec String () Value
81+parseBlock :: I.IndentParser String () Value
8182parseBlock = Block <$> (C.braces $ P.many (parseStatement True))
8283
83−parseValueAtom :: P.Parsec String () Value
84+parseValueAtom :: I.IndentParser String () Value
8485parseValueAtom = P.choice $ map P.try
8586 [ parseNumericLiteral
8687 , parseStringLiteral
@@ -94,7 +95,7 @@ parseValueAtom = P.choice $ map P.try
9495 , parseCase
9596 , C.parens parseValue ]
9697
97−parseValue :: P.Parsec String () Value
98+parseValue :: I.IndentParser String () Value
9899parseValue = buildExpressionParser operators $ C.fold (C.lexeme typedValue) (C.lexeme funArgs) App
99100 where
100101 typedValue = C.augment parseValueAtom parseTypeAnnotation TypedValue
@@ -128,7 +129,7 @@ parseValue = buildExpressionParser operators $ C.fold (C.lexeme typedValue) (C.l
128129 , [ Infix (C.lexeme (P.string "||") >> return (Binary Or)) AssocRight ]
129130 ]
130131
131−parseVariableIntroduction :: Bool -> P.Parsec String () Statement
132+parseVariableIntroduction :: Bool -> I.IndentParser String () Statement
132133parseVariableIntroduction requireSemi = do
133134 C.reserved "var"
134135 name <- C.parseIdent
@@ -137,7 +138,7 @@ parseVariableIntroduction requireSemi = do
137138 when requireSemi (void C.semi)
138139 return $ VariableIntroduction name value
139140
140−parseAssignment :: Bool -> P.Parsec String () (Statement)
141+parseAssignment :: Bool -> I.IndentParser String () (Statement)
141142parseAssignment requireSemi = do
142143 tgt <- parseAssignmentTarget
143144 C.lexeme $ P.char '='
@@ -145,14 +146,14 @@ parseAssignment requireSemi = do
145146 when requireSemi (void C.semi)
146147 return $ Assignment tgt value
147148
148−parseManyStatements :: P.Parsec String () [Statement]
149+parseManyStatements :: I.IndentParser String () [Statement]
149150parseManyStatements = C.braces $ P.many (parseStatement True)
150151
151−parseWhile :: P.Parsec String () Statement
152+parseWhile :: I.IndentParser String () Statement
152153parseWhile = While <$> (C.reserved "while" *> C.parens parseValue)
153154 <*> parseManyStatements
154155
155−parseFor :: P.Parsec String () Statement
156+parseFor :: I.IndentParser String () Statement
156157parseFor = For <$> (C.reserved "for" *> C.parens forIntro)
157158 <*> parseManyStatements
158159 where
@@ -160,16 +161,16 @@ parseFor = For <$> (C.reserved "for" *> C.parens forIntro)
160161 <*> (C.semi *> parseValue)
161162 <*> (C.semi *> parseStatement False)
162163
163−parseIfThenElse :: P.Parsec String () Statement
164+parseIfThenElse :: I.IndentParser String () Statement
164165parseIfThenElse = IfThenElse
165166 <$> (C.reserved "if" *> C.parens parseValue)
166167 <*> parseManyStatements
167168 <*> P.optionMaybe (C.reserved "else" *> parseManyStatements)
168169
169−parseReturn :: Bool -> P.Parsec String () Statement
170+parseReturn :: Bool -> I.IndentParser String () Statement
170171parseReturn requireSemi = Return <$> (C.reserved "return" *> parseValue <* when requireSemi (void C.semi))
171172
172−parseStatement :: Bool -> P.Parsec String () Statement
173+parseStatement :: Bool -> I.IndentParser String () Statement
173174parseStatement requireSemi = P.choice $ map P.try
174175 [ parseVariableIntroduction requireSemi
175176 , parseAssignment requireSemi
@@ -178,38 +179,38 @@ parseStatement requireSemi = P.choice $ map P.try
178179 , parseIfThenElse
179180 , parseReturn requireSemi ]
180181
181−parseStringBinder :: P.Parsec String () Binder
182+parseStringBinder :: I.IndentParser String () Binder
182183parseStringBinder = StringBinder <$> C.stringLiteral
183184
184−parseBooleanBinder :: P.Parsec String () Binder
185+parseBooleanBinder :: I.IndentParser String () Binder
185186parseBooleanBinder = BooleanBinder <$> booleanLiteral
186187
187−parseNumberBinder :: P.Parsec String () Binder
188+parseNumberBinder :: I.IndentParser String () Binder
188189parseNumberBinder = NumberBinder <$> C.naturalOrFloat
189190
190−parseVarBinder :: P.Parsec String () Binder
191+parseVarBinder :: I.IndentParser String () Binder
191192parseVarBinder = VarBinder <$> C.parseIdent
192193
193−parseNullaryBinder :: P.Parsec String () Binder
194+parseNullaryBinder :: I.IndentParser String () Binder
194195parseNullaryBinder = NullaryBinder <$> C.lexeme C.properName
195196
196−parseUnaryBinder :: P.Parsec String () Binder
197+parseUnaryBinder :: I.IndentParser String () Binder
197198parseUnaryBinder = UnaryBinder <$> C.lexeme C.properName <*> parseBinder
198199
199−parseObjectBinder :: P.Parsec String () Binder
200+parseObjectBinder :: I.IndentParser String () Binder
200201parseObjectBinder = ObjectBinder <$> C.braces (C.commaSep parseIdentifierAndBinder)
201202
202−parseArrayBinder :: P.Parsec String () Binder
203+parseArrayBinder :: I.IndentParser String () Binder
203204parseArrayBinder = C.squares $ ArrayBinder <$> (C.commaSep parseBinder) <*> P.optionMaybe (C.colon *> parseBinder)
204205
205−parseIdentifierAndBinder :: P.Parsec String () (String, Binder)
206+parseIdentifierAndBinder :: I.IndentParser String () (String, Binder)
206207parseIdentifierAndBinder = do
207208 name <- C.lexeme C.identifier
208209 C.lexeme $ P.char '='
209210 binder <- parseBinder
210211 return (name, binder)
211212
212−parseBinder :: P.Parsec String () Binder
213+parseBinder :: I.IndentParser String () Binder
213214parseBinder = P.choice $ map P.try
214215 [ parseStringBinder
215216 , parseBooleanBinder
@@ -221,7 +222,7 @@ parseBinder = P.choice $ map P.try
221222 , parseArrayBinder
222223 , C.parens parseBinder ]
223224
224−parseAssignmentTarget :: P.Parsec String () AssignmentTarget
225+parseAssignmentTarget :: I.IndentParser String () AssignmentTarget
225226parseAssignmentTarget = buildExpressionParser operators (AssignVariable <$> C.parseIdent)
226227 where
227228 operators = [ [ Postfix $ AssignArrayIndex <$> C.squares parseValue