git.iko.soy/rowtype-yoga/purescript-native
on golang help sign in
Char literals
5afb6e0Phil Freeman
src/Language/PureScript/AST/Binders.hs+4
@@ -39,6 +39,10 @@ data Binder
39 --
39 --
40 | StringBinder String
40 | StringBinder String
41 -- |
41 -- |
42+ -- A binder which matches a character literal
43+ --
44+ | CharBinder Char
45+ -- |
42 -- A binder which matches a numeric literal
46 -- A binder which matches a numeric literal
43 --
47 --
44 | NumberBinder (Either Integer Double)
48 | NumberBinder (Either Integer Double)
src/Language/PureScript/AST/Declarations.hs+4
@@ -302,6 +302,10 @@ data Expr
302 --
302 --
303 | StringLiteral String
303 | StringLiteral String
304 -- |
304 -- |
305+ -- A character literal
306+ --
307+ | CharLiteral Char
308+ -- |
305 -- A boolean literal
309 -- A boolean literal
306 --
310 --
307 | BooleanLiteral Bool
311 | BooleanLiteral Bool
src/Language/PureScript/CodeGen/JS.hs+3
@@ -205,6 +205,7 @@ moduleToJs (Module coms mn imps exps foreigns decls) = do
205 literalToValueJS :: Literal (Expr Ann) -> m JS
205 literalToValueJS :: Literal (Expr Ann) -> m JS
206 literalToValueJS (NumericLiteral n) = return $ JSNumericLiteral n
206 literalToValueJS (NumericLiteral n) = return $ JSNumericLiteral n
207 literalToValueJS (StringLiteral s) = return $ JSStringLiteral s
207 literalToValueJS (StringLiteral s) = return $ JSStringLiteral s
208+ literalToValueJS (CharLiteral c) = return $ JSStringLiteral [c]
208 literalToValueJS (BooleanLiteral b) = return $ JSBooleanLiteral b
209 literalToValueJS (BooleanLiteral b) = return $ JSBooleanLiteral b
209 literalToValueJS (ArrayLiteral xs) = JSArrayLiteral <$> mapM valueToJs xs
210 literalToValueJS (ArrayLiteral xs) = JSArrayLiteral <$> mapM valueToJs xs
210 literalToValueJS (ObjectLiteral ps) = JSObjectLiteral <$> mapM (sndM valueToJs) ps
211 literalToValueJS (ObjectLiteral ps) = JSObjectLiteral <$> mapM (sndM valueToJs) ps
@@ -327,6 +328,8 @@ moduleToJs (Module coms mn imps exps foreigns decls) = do
327 literalToBinderJS :: String -> [JS] -> Literal (Binder Ann) -> m [JS]
328 literalToBinderJS :: String -> [JS] -> Literal (Binder Ann) -> m [JS]
328 literalToBinderJS varName done (NumericLiteral num) =
329 literalToBinderJS varName done (NumericLiteral num) =
329 return [JSIfElse (JSBinary EqualTo (JSVar varName) (JSNumericLiteral num)) (JSBlock done) Nothing]
330 return [JSIfElse (JSBinary EqualTo (JSVar varName) (JSNumericLiteral num)) (JSBlock done) Nothing]
331+ literalToBinderJS varName done (CharLiteral c) =
332+ return [JSIfElse (JSBinary EqualTo (JSVar varName) (JSStringLiteral [c])) (JSBlock done) Nothing]
330 literalToBinderJS varName done (StringLiteral str) =
333 literalToBinderJS varName done (StringLiteral str) =
331 return [JSIfElse (JSBinary EqualTo (JSVar varName) (JSStringLiteral str)) (JSBlock done) Nothing]
334 return [JSIfElse (JSBinary EqualTo (JSVar varName) (JSStringLiteral str)) (JSBlock done) Nothing]
332 literalToBinderJS varName done (BooleanLiteral True) =
335 literalToBinderJS varName done (BooleanLiteral True) =
src/Language/PureScript/CoreFn/Desugar.hs+4
@@ -83,6 +83,8 @@ moduleToCoreFn env (A.Module coms mn decls (Just exps)) =
83 Literal (ss, com, ty, Nothing) (NumericLiteral v)
83 Literal (ss, com, ty, Nothing) (NumericLiteral v)
84 exprToCoreFn ss com ty (A.StringLiteral v) =
84 exprToCoreFn ss com ty (A.StringLiteral v) =
85 Literal (ss, com, ty, Nothing) (StringLiteral v)
85 Literal (ss, com, ty, Nothing) (StringLiteral v)
86+ exprToCoreFn ss com ty (A.CharLiteral v) =
87+ Literal (ss, com, ty, Nothing) (CharLiteral v)
86 exprToCoreFn ss com ty (A.BooleanLiteral v) =
88 exprToCoreFn ss com ty (A.BooleanLiteral v) =
87 Literal (ss, com, ty, Nothing) (BooleanLiteral v)
89 Literal (ss, com, ty, Nothing) (BooleanLiteral v)
88 exprToCoreFn ss com ty (A.ArrayLiteral vs) =
90 exprToCoreFn ss com ty (A.ArrayLiteral vs) =
@@ -147,6 +149,8 @@ moduleToCoreFn env (A.Module coms mn decls (Just exps)) =
147 LiteralBinder (ss, com, Nothing, Nothing) (BooleanLiteral b)
149 LiteralBinder (ss, com, Nothing, Nothing) (BooleanLiteral b)
148 binderToCoreFn ss com (A.StringBinder s) =
150 binderToCoreFn ss com (A.StringBinder s) =
149 LiteralBinder (ss, com, Nothing, Nothing) (StringLiteral s)
151 LiteralBinder (ss, com, Nothing, Nothing) (StringLiteral s)
152+ binderToCoreFn ss com (A.CharBinder c) =
153+ LiteralBinder (ss, com, Nothing, Nothing) (CharLiteral c)
150 binderToCoreFn ss com (A.NumberBinder n) =
154 binderToCoreFn ss com (A.NumberBinder n) =
151 LiteralBinder (ss, com, Nothing, Nothing) (NumericLiteral n)
155 LiteralBinder (ss, com, Nothing, Nothing) (NumericLiteral n)
152 binderToCoreFn ss com (A.VarBinder name) =
156 binderToCoreFn ss com (A.VarBinder name) =
src/Language/PureScript/CoreFn/Literals.hs+4
@@ -33,6 +33,10 @@ data Literal a
33 --
33 --
34 | StringLiteral String
34 | StringLiteral String
35 -- |
35 -- |
36+ -- A character literal
37+ --
38+ | CharLiteral Char
39+ -- |
36 -- A boolean literal
40 -- A boolean literal
37 --
41 --
38 | BooleanLiteral Bool
42 | BooleanLiteral Bool
src/Language/PureScript/Parser/Declarations.hs+9
@@ -284,6 +284,9 @@ booleanLiteral = (reserved "true" >> return True) P.<|> (reserved "false" >> ret
284parseNumericLiteral :: TokenParser Expr
284parseNumericLiteral :: TokenParser Expr
285parseNumericLiteral = NumericLiteral <$> number
285parseNumericLiteral = NumericLiteral <$> number
286
286
287+parseCharLiteral :: TokenParser Expr
288+parseCharLiteral = CharLiteral <$> charLiteral
289+
287parseStringLiteral :: TokenParser Expr
290parseStringLiteral :: TokenParser Expr
288parseStringLiteral = StringLiteral <$> stringLiteral
291parseStringLiteral = StringLiteral <$> stringLiteral
289
292
@@ -350,6 +353,7 @@ parseLet = do
350parseValueAtom :: TokenParser Expr
353parseValueAtom :: TokenParser Expr
351parseValueAtom = P.choice
354parseValueAtom = P.choice
352 [ P.try parseNumericLiteral
355 [ P.try parseNumericLiteral
356+ , P.try parseCharLiteral
353 , P.try parseStringLiteral
357 , P.try parseStringLiteral
354 , P.try parseBooleanLiteral
358 , P.try parseBooleanLiteral
355 , parseArrayLiteral
359 , parseArrayLiteral
@@ -442,6 +446,9 @@ parseObjectUpdaterWildcard = underscore *> C.indented *> parseUpdaterBody Nothin
442parseStringBinder :: TokenParser Binder
446parseStringBinder :: TokenParser Binder
443parseStringBinder = StringBinder <$> stringLiteral
447parseStringBinder = StringBinder <$> stringLiteral
444
448
449+parseCharBinder :: TokenParser Binder
450+parseCharBinder = CharBinder <$> charLiteral
451+
445parseBooleanBinder :: TokenParser Binder
452parseBooleanBinder :: TokenParser Binder
446parseBooleanBinder = BooleanBinder <$> booleanLiteral
453parseBooleanBinder = BooleanBinder <$> booleanLiteral
447
454
@@ -492,6 +499,7 @@ parseBinder = withSourceSpan PositionedBinder (P.buildExpressionParser operators
492 parseBinderAtom :: TokenParser Binder
499 parseBinderAtom :: TokenParser Binder
493 parseBinderAtom = P.choice (map P.try
500 parseBinderAtom = P.choice (map P.try
494 [ parseNullBinder
501 [ parseNullBinder
502+ , parseCharBinder
495 , parseStringBinder
503 , parseStringBinder
496 , parseBooleanBinder
504 , parseBooleanBinder
497 , parseNumberBinder
505 , parseNumberBinder
@@ -508,6 +516,7 @@ parseBinder = withSourceSpan PositionedBinder (P.buildExpressionParser operators
508parseBinderNoParens :: TokenParser Binder
516parseBinderNoParens :: TokenParser Binder
509parseBinderNoParens = P.choice (map P.try
517parseBinderNoParens = P.choice (map P.try
510 [ parseNullBinder
518 [ parseNullBinder
519+ , parseCharBinder
511 , parseStringBinder
520 , parseStringBinder
512 , parseBooleanBinder
521 , parseBooleanBinder
513 , parseNumberBinder
522 , parseNumberBinder
src/Language/PureScript/Parser/Lexer.hs+13
@@ -61,6 +61,7 @@ module Language.PureScript.Parser.Lexer
61 , symbol
61 , symbol
62 , symbol'
62 , symbol'
63 , identifier
63 , identifier
64+ , charLiteral
64 , stringLiteral
65 , stringLiteral
65 , number
66 , number
66 , natural
67 , natural
@@ -111,6 +112,7 @@ data Token
111 | UName String
112 | UName String
112 | Qualifier String
113 | Qualifier String
113 | Symbol String
114 | Symbol String
115+ | CharLiteral Char
114 | StringLiteral String
116 | StringLiteral String
115 | Number (Either Integer Double)
117 | Number (Either Integer Double)
116 deriving (Show, Eq, Ord)
118 deriving (Show, Eq, Ord)
@@ -141,6 +143,7 @@ prettyPrintToken (LName s) = show s
141prettyPrintToken (UName s) = show s
143prettyPrintToken (UName s) = show s
142prettyPrintToken (Qualifier _) = "qualifier"
144prettyPrintToken (Qualifier _) = "qualifier"
143prettyPrintToken (Symbol s) = s
145prettyPrintToken (Symbol s) = s
146+prettyPrintToken (CharLiteral c) = show c
144prettyPrintToken (StringLiteral s) = show s
147prettyPrintToken (StringLiteral s) = show s
145prettyPrintToken (Number n) = either show show n
148prettyPrintToken (Number n) = either show show n
146
149
@@ -204,6 +207,7 @@ parseToken = P.choice
204 , do uName <- parseUName
207 , do uName <- parseUName
205 (guard (validModuleName uName) >> Qualifier uName <$ P.char '.') <|> pure (UName uName)
208 (guard (validModuleName uName) >> Qualifier uName <$ P.char '.') <|> pure (UName uName)
206 , Symbol <$> parseSymbol
209 , Symbol <$> parseSymbol
210+ , CharLiteral <$> parseCharLiteral
207 , StringLiteral <$> parseStringLiteral
211 , StringLiteral <$> parseStringLiteral
208 , Number <$> parseNumber
212 , Number <$> parseNumber
209 ] <* whitespace
213 ] <* whitespace
@@ -230,6 +234,9 @@ parseToken = P.choice
230 symbolChar :: P.Parsec String u Char
234 symbolChar :: P.Parsec String u Char
231 symbolChar = P.oneOf opChars
235 symbolChar = P.oneOf opChars
232
236
237+ parseCharLiteral :: P.Parsec String u Char
238+ parseCharLiteral = PT.charLiteral tokenParser
239+
233 parseStringLiteral :: P.Parsec String u String
240 parseStringLiteral :: P.Parsec String u String
234 parseStringLiteral = blockString <|> PT.stringLiteral tokenParser
241 parseStringLiteral = blockString <|> PT.stringLiteral tokenParser
235 where
242 where
@@ -433,6 +440,12 @@ symbol' s = token go P.<?> show s
433 go LFatArrow | s == "<=" = Just ()
440 go LFatArrow | s == "<=" = Just ()
434 go _ = Nothing
441 go _ = Nothing
435
442
443+charLiteral :: TokenParser Char
444+charLiteral = token go P.<?> "char literal"
445+ where
446+ go (CharLiteral c) = Just c
447+ go _ = Nothing
448+
436stringLiteral :: TokenParser String
449stringLiteral :: TokenParser String
437stringLiteral = token go P.<?> "string literal"
450stringLiteral = token go P.<?> "string literal"
438 where
451 where
src/Language/PureScript/Pretty/Values.hs+2
@@ -37,6 +37,7 @@ literals = mkPattern' match
37 match :: Expr -> StateT PrinterState Maybe String
37 match :: Expr -> StateT PrinterState Maybe String
38 match (NumericLiteral n) = return $ either show show n
38 match (NumericLiteral n) = return $ either show show n
39 match (StringLiteral s) = return $ show s
39 match (StringLiteral s) = return $ show s
40+ match (CharLiteral c) = return $ show c
40 match (BooleanLiteral True) = return "true"
41 match (BooleanLiteral True) = return "true"
41 match (BooleanLiteral False) = return "false"
42 match (BooleanLiteral False) = return "false"
42 match (ArrayLiteral xs) = concat <$> sequence
43 match (ArrayLiteral xs) = concat <$> sequence
@@ -193,6 +194,7 @@ prettyPrintBinderAtom = mkPattern' match
193 match :: Binder -> StateT PrinterState Maybe String
194 match :: Binder -> StateT PrinterState Maybe String
194 match NullBinder = return "_"
195 match NullBinder = return "_"
195 match (StringBinder str) = return $ show str
196 match (StringBinder str) = return $ show str
197+ match (CharBinder c) = return $ show c
196 match (NumberBinder num) = return $ either show show num
198 match (NumberBinder num) = return $ either show show num
197 match (BooleanBinder True) = return "true"
199 match (BooleanBinder True) = return "true"
198 match (BooleanBinder False) = return "false"
200 match (BooleanBinder False) = return "false"
src/Language/PureScript/TypeChecker/Types.hs+4
@@ -215,6 +215,7 @@ infer' :: Expr -> UnifyT Type Check Expr
215infer' v@(NumericLiteral (Left _)) = return $ TypedValue True v tyInt
215infer' v@(NumericLiteral (Left _)) = return $ TypedValue True v tyInt
216infer' v@(NumericLiteral (Right _)) = return $ TypedValue True v tyNumber
216infer' v@(NumericLiteral (Right _)) = return $ TypedValue True v tyNumber
217infer' v@(StringLiteral _) = return $ TypedValue True v tyString
217infer' v@(StringLiteral _) = return $ TypedValue True v tyString
218+infer' v@(CharLiteral _) = return $ TypedValue True v tyChar
218infer' v@(BooleanLiteral _) = return $ TypedValue True v tyBoolean
219infer' v@(BooleanLiteral _) = return $ TypedValue True v tyBoolean
219infer' (ArrayLiteral vals) = do
220infer' (ArrayLiteral vals) = do
220 ts <- mapM infer vals
221 ts <- mapM infer vals
@@ -351,6 +352,7 @@ inferProperty _ _ = return Nothing
351inferBinder :: Type -> Binder -> UnifyT Type Check (M.Map Ident Type)
352inferBinder :: Type -> Binder -> UnifyT Type Check (M.Map Ident Type)
352inferBinder _ NullBinder = return M.empty
353inferBinder _ NullBinder = return M.empty
353inferBinder val (StringBinder _) = val =?= tyString >> return M.empty
354inferBinder val (StringBinder _) = val =?= tyString >> return M.empty
355+inferBinder val (CharBinder _) = val =?= tyChar >> return M.empty
354inferBinder val (NumberBinder (Left _)) = val =?= tyInt >> return M.empty
356inferBinder val (NumberBinder (Left _)) = val =?= tyInt >> return M.empty
355inferBinder val (NumberBinder (Right _)) = val =?= tyNumber >> return M.empty
357inferBinder val (NumberBinder (Right _)) = val =?= tyNumber >> return M.empty
356inferBinder val (BooleanBinder _) = val =?= tyBoolean >> return M.empty
358inferBinder val (BooleanBinder _) = val =?= tyBoolean >> return M.empty
@@ -466,6 +468,8 @@ check' v@(NumericLiteral (Right _)) t | t == tyNumber =
466 return $ TypedValue True v t
468 return $ TypedValue True v t
467check' v@(StringLiteral _) t | t == tyString =
469check' v@(StringLiteral _) t | t == tyString =
468 return $ TypedValue True v t
470 return $ TypedValue True v t
471+check' v@(CharLiteral _) t | t == tyChar =
472+ return $ TypedValue True v t
469check' v@(BooleanLiteral _) t | t == tyBoolean =
473check' v@(BooleanLiteral _) t | t == tyBoolean =
470 return $ TypedValue True v t
474 return $ TypedValue True v t
471check' (ArrayLiteral vals) t@(TypeApp a ty) = do
475check' (ArrayLiteral vals) t@(TypeApp a ty) = do