git.iko.soy/rowtype-yoga/purescript-native
on golang help sign in
Merge pull request #699 from michaelficarra/GH-606
12e296ePhil Freeman
examples/passing/ReservedWords.pursnew file+13
@@ -0,0 +1,13 @@
1+-- See https://github.com/purescript/purescript/issues/606
2+module Main where
3+
4+ o :: { type :: String }
5+ o = { type: "o" }
6+
7+ p :: { type :: String }
8+ p = o { type = "p" }
9+
10+ f :: forall r. { type :: String | r } -> String
11+ f { type = "p" } = "Done"
12+
13+ main = Debug.Trace.trace $ f { type: p.type, foo: "bar" }
src/Language/PureScript/Parser/Common.hs+6
@@ -133,6 +133,12 @@ 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 $ (:) <$> identStart <*> many identLetter
141+
136-- |
142-- |
137-- Parse a reserved word
143-- Parse a reserved word
138--
144--
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))