git.iko.soy/rowtype-yoga/purescript-native
on golang help sign in
fixes #606: allow unquoted keywords as key names in record literals

... as well as other related positions

commit420d0123b643f6d9b24d45f7e5b48eba70270d17 authorMichael Ficarra <git@michael.ficarra.me> dateSun 9 Nov 2014, 23:36 (12 years ago) parent835dd10
4 files changed+25−5
examples/passing/ReservedWords.purs+11 src/Language/PureScript/Parser/Common.hs+9 src/Language/PureScript/Parser/Declarations.hs+4−4 src/Language/PureScript/Parser/Types.hs+1−1
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
133133identifier :: P.Parsec String u String
134134identifier = PT.identifier tokenParser
135135
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+
136145-- |
137146-- Parse a reserved word
138147--
src/Language/PureScript/Parser/Declarations.hs+4−4
@@ -269,7 +269,7 @@ parseObjectLiteral :: P.Parsec String ParseState Expr
269269parseObjectLiteral = ObjectLiteral <$> C.braces (C.commaSep parseIdentifierAndValue)
270270
271271parseIdentifierAndValue :: 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)
273273 <*> (C.indented *> parseValue)
274274
275275parseAbs :: P.Parsec String ParseState Expr
@@ -332,14 +332,14 @@ parseValueAtom = P.choice
332332
333333parsePropertyUpdate :: P.Parsec String ParseState (String, Expr)
334334parsePropertyUpdate = do
335− name <- C.lexeme (C.identifier <|> C.stringLiteral)
335+ name <- C.lexeme (C.identifierName <|> C.stringLiteral)
336336 _ <- C.lexeme $ C.indented *> P.char '='
337337 value <- C.indented *> parseValue
338338 return (name, value)
339339
340340parseAccessor :: Expr -> P.Parsec String ParseState Expr
341341parseAccessor (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
343343
344344parseDo :: P.Parsec String ParseState Expr
345345parseDo = do
@@ -419,7 +419,7 @@ parseNullBinder = C.lexeme (P.char '_' *> P.notFollowedBy C.identLetter) *> retu
419419
420420parseIdentifierAndBinder :: P.Parsec String ParseState (String, Binder)
421421parseIdentifierAndBinder = do
422− name <- C.lexeme (C.identifier <|> C.stringLiteral)
422+ name <- C.lexeme (C.identifierName <|> C.stringLiteral)
423423 _ <- C.lexeme $ C.indented *> P.char '='
424424 binder <- C.indented *> parseBinder
425425 return (name, binder)
src/Language/PureScript/Parser/Types.hs+1−1
@@ -109,7 +109,7 @@ parsePolyType :: P.Parsec String ParseState Type
109109parsePolyType = parseAnyType
110110
111111parseNameAndType :: 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
113113
114114parseRowEnding :: P.Parsec String ParseState Type
115115parseRowEnding = P.option REmpty (TypeVar <$> (lexeme (indented *> P.char '|') *> indented *> identifier))