@@ -21,38 +21,39 @@ 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
24import Text.Parsec.Expr
25import Text.Parsec.Expr
25import Control.Monad
26import Control.Monad
26import Control.Arrow (Arrow(..))
27import Control.Arrow (Arrow(..))
27import PureScript.Parser.Types
28import PureScript.Parser.Types
28import PureScript.Types
29import PureScript.Types
30−booleanLiteral :: P.Parsec String () Bool
31+booleanLiteral :: I.IndentParser String () Bool
31booleanLiteral = (C.reserved "true" >> return True) P.<|> (C.reserved "false" >> return False)
32booleanLiteral = (C.reserved "true" >> return True) P.<|> (C.reserved "false" >> return False)
33−parseNumericLiteral :: P.Parsec String () Value
34+parseNumericLiteral :: I.IndentParser String () Value
34parseNumericLiteral = NumericLiteral <$> C.naturalOrFloat
35parseNumericLiteral = NumericLiteral <$> C.naturalOrFloat
36−parseStringLiteral :: P.Parsec String () Value
37+parseStringLiteral :: I.IndentParser String () Value
37parseStringLiteral = StringLiteral <$> C.stringLiteral
38parseStringLiteral = StringLiteral <$> C.stringLiteral
39−parseBooleanLiteral :: P.Parsec String () Value
40+parseBooleanLiteral :: I.IndentParser String () Value
40parseBooleanLiteral = BooleanLiteral <$> booleanLiteral
41parseBooleanLiteral = BooleanLiteral <$> booleanLiteral
42−parseArrayLiteral :: P.Parsec String () Value
43+parseArrayLiteral :: I.IndentParser String () Value
43parseArrayLiteral = ArrayLiteral <$> (C.squares $ C.commaSep parseValue)
44parseArrayLiteral = ArrayLiteral <$> (C.squares $ C.commaSep parseValue)
45−parseObjectLiteral :: P.Parsec String () Value
46+parseObjectLiteral :: I.IndentParser String () Value
46parseObjectLiteral = ObjectLiteral <$> (C.braces $ C.commaSep parseIdentifierAndValue)
47parseObjectLiteral = ObjectLiteral <$> (C.braces $ C.commaSep parseIdentifierAndValue)
48−parseIdentifierAndValue :: P.Parsec String () (String, Value)
49+parseIdentifierAndValue :: I.IndentParser String () (String, Value)
49parseIdentifierAndValue = do
50parseIdentifierAndValue = do
50 name <- C.lexeme C.identifier
51 name <- C.lexeme C.identifier
52 value <- parseValue
53 value <- parseValue
53 return (name, value)
54 return (name, value)
55−parseAbs :: P.Parsec String () Value
56+parseAbs :: I.IndentParser String () Value
56parseAbs = do
57parseAbs = do
57 C.lexeme $ P.char '\\'
58 C.lexeme $ P.char '\\'
58 args <- C.commaSep C.parseIdent
59 args <- C.commaSep C.parseIdent
@@ -60,27 +61,27 @@ parseAbs = do
60 value <- parseValue
61 value <- parseValue
61 return $ Abs args value
62 return $ Abs args value
63−parseApp :: P.Parsec String () Value
64+parseApp :: I.IndentParser String () Value
64parseApp = App <$> parseValue
65parseApp = App <$> parseValue
65 <*> (C.parens $ C.commaSep parseValue)
66 <*> (C.parens $ C.commaSep parseValue)
67−parseVar :: P.Parsec String () Value
68+parseVar :: I.IndentParser String () Value
68parseVar = Var <$> C.parseIdent
69parseVar = Var <$> C.parseIdent
70−parseConstructor :: P.Parsec String () Value
71+parseConstructor :: I.IndentParser String () Value
71parseConstructor = Constructor <$> C.properName
72parseConstructor = Constructor <$> C.properName
73−parseCase :: P.Parsec String () Value
74+parseCase :: I.IndentParser String () Value
74parseCase = Case <$> P.between (C.reserved "case") (C.reserved "of") parseValue
75parseCase = Case <$> P.between (C.reserved "case") (C.reserved "of") parseValue
75 <*> C.braces (C.semiSep parseCaseAlternative)
76 <*> C.braces (C.semiSep parseCaseAlternative)
77−parseCaseAlternative :: P.Parsec String () (Binder, Value)
78+parseCaseAlternative :: I.IndentParser String () (Binder, Value)
78parseCaseAlternative = (,) <$> (parseBinder <* C.lexeme (P.string "->")) <*> parseValue
79parseCaseAlternative = (,) <$> (parseBinder <* C.lexeme (P.string "->")) <*> parseValue
80−parseBlock :: P.Parsec String () Value
81+parseBlock :: I.IndentParser String () Value
81parseBlock = Block <$> (C.braces $ P.many (parseStatement True))
82parseBlock = Block <$> (C.braces $ P.many (parseStatement True))
83−parseValueAtom :: P.Parsec String () Value
84+parseValueAtom :: I.IndentParser String () Value
84parseValueAtom = P.choice $ map P.try
85parseValueAtom = P.choice $ map P.try
85 [ parseNumericLiteral
86 [ parseNumericLiteral
86 , parseStringLiteral
87 , parseStringLiteral
@@ -94,7 +95,7 @@ parseValueAtom = P.choice $ map P.try
94 , parseCase
95 , parseCase
95 , C.parens parseValue ]
96 , C.parens parseValue ]
97−parseValue :: P.Parsec String () Value
98+parseValue :: I.IndentParser String () Value
98parseValue = buildExpressionParser operators $ C.fold (C.lexeme typedValue) (C.lexeme funArgs) App
99parseValue = buildExpressionParser operators $ C.fold (C.lexeme typedValue) (C.lexeme funArgs) App
100 typedValue = C.augment parseValueAtom parseTypeAnnotation TypedValue
101 typedValue = C.augment parseValueAtom parseTypeAnnotation TypedValue
@@ -128,7 +129,7 @@ parseValue = buildExpressionParser operators $ C.fold (C.lexeme typedValue) (C.l
128 , [ Infix (C.lexeme (P.string "||") >> return (Binary Or)) AssocRight ]
129 , [ Infix (C.lexeme (P.string "||") >> return (Binary Or)) AssocRight ]
131−parseVariableIntroduction :: Bool -> P.Parsec String () Statement
132+parseVariableIntroduction :: Bool -> I.IndentParser String () Statement
132parseVariableIntroduction requireSemi = do
133parseVariableIntroduction requireSemi = do
133 C.reserved "var"
134 C.reserved "var"
134 name <- C.parseIdent
135 name <- C.parseIdent
@@ -137,7 +138,7 @@ parseVariableIntroduction requireSemi = do
137 when requireSemi (void C.semi)
138 when requireSemi (void C.semi)
138 return $ VariableIntroduction name value
139 return $ VariableIntroduction name value
140−parseAssignment :: Bool -> P.Parsec String () (Statement)
141+parseAssignment :: Bool -> I.IndentParser String () (Statement)
141parseAssignment requireSemi = do
142parseAssignment requireSemi = do
142 tgt <- parseAssignmentTarget
143 tgt <- parseAssignmentTarget
143 C.lexeme $ P.char '='
144 C.lexeme $ P.char '='
@@ -145,14 +146,14 @@ parseAssignment requireSemi = do
145 when requireSemi (void C.semi)
146 when requireSemi (void C.semi)
146 return $ Assignment tgt value
147 return $ Assignment tgt value
148−parseManyStatements :: P.Parsec String () [Statement]
149+parseManyStatements :: I.IndentParser String () [Statement]
149parseManyStatements = C.braces $ P.many (parseStatement True)
150parseManyStatements = C.braces $ P.many (parseStatement True)
151−parseWhile :: P.Parsec String () Statement
152+parseWhile :: I.IndentParser String () Statement
152parseWhile = While <$> (C.reserved "while" *> C.parens parseValue)
153parseWhile = While <$> (C.reserved "while" *> C.parens parseValue)
153 <*> parseManyStatements
154 <*> parseManyStatements
155−parseFor :: P.Parsec String () Statement
156+parseFor :: I.IndentParser String () Statement
156parseFor = For <$> (C.reserved "for" *> C.parens forIntro)
157parseFor = For <$> (C.reserved "for" *> C.parens forIntro)
157 <*> parseManyStatements
158 <*> parseManyStatements
@@ -160,16 +161,16 @@ parseFor = For <$> (C.reserved "for" *> C.parens forIntro)
160 <*> (C.semi *> parseValue)
161 <*> (C.semi *> parseValue)
161 <*> (C.semi *> parseStatement False)
162 <*> (C.semi *> parseStatement False)
163−parseIfThenElse :: P.Parsec String () Statement
164+parseIfThenElse :: I.IndentParser String () Statement
164parseIfThenElse = IfThenElse
165parseIfThenElse = IfThenElse
165 <$> (C.reserved "if" *> C.parens parseValue)
166 <$> (C.reserved "if" *> C.parens parseValue)
166 <*> parseManyStatements
167 <*> parseManyStatements
167 <*> P.optionMaybe (C.reserved "else" *> parseManyStatements)
168 <*> P.optionMaybe (C.reserved "else" *> parseManyStatements)
169−parseReturn :: Bool -> P.Parsec String () Statement
170+parseReturn :: Bool -> I.IndentParser String () Statement
170parseReturn requireSemi = Return <$> (C.reserved "return" *> parseValue <* when requireSemi (void C.semi))
171parseReturn requireSemi = Return <$> (C.reserved "return" *> parseValue <* when requireSemi (void C.semi))
172−parseStatement :: Bool -> P.Parsec String () Statement
173+parseStatement :: Bool -> I.IndentParser String () Statement
173parseStatement requireSemi = P.choice $ map P.try
174parseStatement requireSemi = P.choice $ map P.try
174 [ parseVariableIntroduction requireSemi
175 [ parseVariableIntroduction requireSemi
175 , parseAssignment requireSemi
176 , parseAssignment requireSemi
@@ -178,38 +179,38 @@ parseStatement requireSemi = P.choice $ map P.try
178 , parseIfThenElse
179 , parseIfThenElse
179 , parseReturn requireSemi ]
180 , parseReturn requireSemi ]
181−parseStringBinder :: P.Parsec String () Binder
182+parseStringBinder :: I.IndentParser String () Binder
182parseStringBinder = StringBinder <$> C.stringLiteral
183parseStringBinder = StringBinder <$> C.stringLiteral
184−parseBooleanBinder :: P.Parsec String () Binder
185+parseBooleanBinder :: I.IndentParser String () Binder
185parseBooleanBinder = BooleanBinder <$> booleanLiteral
186parseBooleanBinder = BooleanBinder <$> booleanLiteral
187−parseNumberBinder :: P.Parsec String () Binder
188+parseNumberBinder :: I.IndentParser String () Binder
188parseNumberBinder = NumberBinder <$> C.naturalOrFloat
189parseNumberBinder = NumberBinder <$> C.naturalOrFloat
190−parseVarBinder :: P.Parsec String () Binder
191+parseVarBinder :: I.IndentParser String () Binder
191parseVarBinder = VarBinder <$> C.parseIdent
192parseVarBinder = VarBinder <$> C.parseIdent
193−parseNullaryBinder :: P.Parsec String () Binder
194+parseNullaryBinder :: I.IndentParser String () Binder
194parseNullaryBinder = NullaryBinder <$> C.lexeme C.properName
195parseNullaryBinder = NullaryBinder <$> C.lexeme C.properName
196−parseUnaryBinder :: P.Parsec String () Binder
197+parseUnaryBinder :: I.IndentParser String () Binder
197parseUnaryBinder = UnaryBinder <$> C.lexeme C.properName <*> parseBinder
198parseUnaryBinder = UnaryBinder <$> C.lexeme C.properName <*> parseBinder
199−parseObjectBinder :: P.Parsec String () Binder
200+parseObjectBinder :: I.IndentParser String () Binder
200parseObjectBinder = ObjectBinder <$> C.braces (C.commaSep parseIdentifierAndBinder)
201parseObjectBinder = ObjectBinder <$> C.braces (C.commaSep parseIdentifierAndBinder)
202−parseArrayBinder :: P.Parsec String () Binder
203+parseArrayBinder :: I.IndentParser String () Binder
203parseArrayBinder = C.squares $ ArrayBinder <$> (C.commaSep parseBinder) <*> P.optionMaybe (C.colon *> parseBinder)
204parseArrayBinder = C.squares $ ArrayBinder <$> (C.commaSep parseBinder) <*> P.optionMaybe (C.colon *> parseBinder)
205−parseIdentifierAndBinder :: P.Parsec String () (String, Binder)
206+parseIdentifierAndBinder :: I.IndentParser String () (String, Binder)
206parseIdentifierAndBinder = do
207parseIdentifierAndBinder = do
207 name <- C.lexeme C.identifier
208 name <- C.lexeme C.identifier
208 C.lexeme $ P.char '='
209 C.lexeme $ P.char '='
209 binder <- parseBinder
210 binder <- parseBinder
210 return (name, binder)
211 return (name, binder)
212−parseBinder :: P.Parsec String () Binder
213+parseBinder :: I.IndentParser String () Binder
213parseBinder = P.choice $ map P.try
214parseBinder = P.choice $ map P.try
214 [ parseStringBinder
215 [ parseStringBinder
215 , parseBooleanBinder
216 , parseBooleanBinder
@@ -221,7 +222,7 @@ parseBinder = P.choice $ map P.try
221 , parseArrayBinder
222 , parseArrayBinder
222 , C.parens parseBinder ]
223 , C.parens parseBinder ]
224−parseAssignmentTarget :: P.Parsec String () AssignmentTarget
225+parseAssignmentTarget :: I.IndentParser String () AssignmentTarget
225parseAssignmentTarget = buildExpressionParser operators (AssignVariable <$> C.parseIdent)
226parseAssignmentTarget = buildExpressionParser operators (AssignVariable <$> C.parseIdent)
227 operators = [ [ Postfix $ AssignArrayIndex <$> C.squares parseValue
228 operators = [ [ Postfix $ AssignArrayIndex <$> C.squares parseValue