git.iko.soy/rowtype-yoga/purescript-native
on golang help sign in
fixes #606: allow unquoted keywords as key names in record literals
420d012Michael Ficarra
examples/passing/ReservedWords.pursnew file+11
@@ -0,0 +1,11 @@
1+module Main where
2+
3+ o :: { type :: String }
4+ o = { type: "Done" }
5+
6+ p = o { type = o.type }
7+
8+ f :: forall r. { type :: String | r } -> String
9+ f { type = a } = a
10+
11+ main = Debug.Trace.trace p.type
src/Language/PureScript/Parser/Common.hs+9
@@ -133,6 +133,15 @@ lexeme = PT.lexeme tokenParser
133identifier :: P.Parsec String u String
133identifier :: P.Parsec String u String
134identifier = PT.identifier tokenParser
134identifier = PT.identifier tokenParser
135
135
136+-- |
137+-- Parse an identifier in a more permissive position
138+--
139+identifierName :: P.Parsec String u String
140+identifierName = lexeme $ do
141+ c <- identStart
142+ cs <- many identLetter
143+ return (c:cs)
144+
136-- |
145-- |
137-- Parse a reserved word
146-- Parse a reserved word
138--
147--
src/Language/PureScript/Parser/Declarations.hs+4−4
@@ -269,7 +269,7 @@ parseObjectLiteral :: P.Parsec String ParseState Expr
269parseObjectLiteral = ObjectLiteral <$> C.braces (C.commaSep parseIdentifierAndValue)
269parseObjectLiteral = ObjectLiteral <$> C.braces (C.commaSep parseIdentifierAndValue)
270
270
271parseIdentifierAndValue :: P.Parsec String ParseState (String, Expr)
271parseIdentifierAndValue :: P.Parsec String ParseState (String, Expr)
272−parseIdentifierAndValue = (,) <$> (C.indented *> (C.identifier <|> C.stringLiteral) <* C.indented <* C.colon)
272+parseIdentifierAndValue = (,) <$> (C.indented *> (C.identifierName <|> C.stringLiteral) <* C.indented <* C.colon)
273 <*> (C.indented *> parseValue)
273 <*> (C.indented *> parseValue)
274
274
275parseAbs :: P.Parsec String ParseState Expr
275parseAbs :: P.Parsec String ParseState Expr
@@ -332,14 +332,14 @@ parseValueAtom = P.choice
332
332
333parsePropertyUpdate :: P.Parsec String ParseState (String, Expr)
333parsePropertyUpdate :: P.Parsec String ParseState (String, Expr)
334parsePropertyUpdate = do
334parsePropertyUpdate = do
335− name <- C.lexeme (C.identifier <|> C.stringLiteral)
335+ name <- C.lexeme (C.identifierName <|> C.stringLiteral)
336 _ <- C.lexeme $ C.indented *> P.char '='
336 _ <- C.lexeme $ C.indented *> P.char '='
337 value <- C.indented *> parseValue
337 value <- C.indented *> parseValue
338 return (name, value)
338 return (name, value)
339
339
340parseAccessor :: Expr -> P.Parsec String ParseState Expr
340parseAccessor :: Expr -> P.Parsec String ParseState Expr
341parseAccessor (Constructor _) = P.unexpected "constructor"
341parseAccessor (Constructor _) = P.unexpected "constructor"
342−parseAccessor obj = P.try $ Accessor <$> (C.indented *> C.dot *> P.notFollowedBy C.opLetter *> C.indented *> (C.identifier <|> C.stringLiteral)) <*> pure obj
342+parseAccessor obj = P.try $ Accessor <$> (C.indented *> C.dot *> P.notFollowedBy C.opLetter *> C.indented *> (C.identifierName <|> C.stringLiteral)) <*> pure obj
343
343
344parseDo :: P.Parsec String ParseState Expr
344parseDo :: P.Parsec String ParseState Expr
345parseDo = do
345parseDo = do
@@ -419,7 +419,7 @@ parseNullBinder = C.lexeme (P.char '_' *> P.notFollowedBy C.identLetter) *> retu
419
419
420parseIdentifierAndBinder :: P.Parsec String ParseState (String, Binder)
420parseIdentifierAndBinder :: P.Parsec String ParseState (String, Binder)
421parseIdentifierAndBinder = do
421parseIdentifierAndBinder = do
422− name <- C.lexeme (C.identifier <|> C.stringLiteral)
422+ name <- C.lexeme (C.identifierName <|> C.stringLiteral)
423 _ <- C.lexeme $ C.indented *> P.char '='
423 _ <- C.lexeme $ C.indented *> P.char '='
424 binder <- C.indented *> parseBinder
424 binder <- C.indented *> parseBinder
425 return (name, binder)
425 return (name, binder)
src/Language/PureScript/Parser/Types.hs+1−1
@@ -109,7 +109,7 @@ parsePolyType :: P.Parsec String ParseState Type
109parsePolyType = parseAnyType
109parsePolyType = parseAnyType
110
110
111parseNameAndType :: P.Parsec String ParseState t -> P.Parsec String ParseState (String, t)
111parseNameAndType :: P.Parsec String ParseState t -> P.Parsec String ParseState (String, t)
112−parseNameAndType p = (,) <$> (indented *> (identifier <|> stringLiteral) <* indented <* lexeme (P.string "::")) <*> p
112+parseNameAndType p = (,) <$> (indented *> (identifierName <|> stringLiteral) <* indented <* lexeme (P.string "::")) <*> p
113
113
114parseRowEnding :: P.Parsec String ParseState Type
114parseRowEnding :: P.Parsec String ParseState Type
115parseRowEnding = P.option REmpty (TypeVar <$> (lexeme (indented *> P.char '|') *> indented *> identifier))
115parseRowEnding = P.option REmpty (TypeVar <$> (lexeme (indented *> P.char '|') *> indented *> identifier))