git.iko.soy/rowtype-yoga/purescript-native
on golang help sign in
Lift restriction on underscores in unames

Don't allow apostrophes in unames, though, as they aren't properly handled when producing JS class names. Keep restriction on module names, due to CommonJS module naming.

commit3fa8e4fc4eb35d1f16b4069df3fea94ac7216505 authorDylan Simon <dylan@dylex.net> dateThu 25 Dec 2014, 14:14 (12 years ago) parentd0dc08c
4 files changed+30−5
examples/failing/UnderscoreModuleName.purs+3 examples/passing/UnderscoreIdent.purs+9 src/Language/PureScript/Parser/Common.hs+1−1 src/Language/PureScript/Parser/Lexer.hs+17−4
examples/failing/UnderscoreModuleName.pursnew file+3
@@ -0,0 +1,3 @@
1+module Bad_Module where
2+
3+main = Debug.Trace.trace "Done"
examples/passing/UnderscoreIdent.pursnew file+9
@@ -0,0 +1,9 @@
1+module Main where
2+
3+data Data_type = Con_Structor | Con_2 String
4+
5+type Type_name = Data_type
6+
7+done (Con_2 s) = s
8+
9+main = Debug.Trace.trace (done (Con_2 "Done"))
src/Language/PureScript/Parser/Common.hs+1−1
@@ -37,7 +37,7 @@ moduleName = part []
3737 where
3838 part path = (do name <- ProperName <$> P.try qualifier
3939 part (path `snoc` name))
40− <|> (ModuleName . snoc path <$> properName)
40+ <|> (ModuleName . snoc path . ProperName <$> mname)
4141 snoc path name = path ++ [name]
4242
4343-- |
src/Language/PureScript/Parser/Lexer.hs+17−4
@@ -54,6 +54,7 @@ module Language.PureScript.Parser.Lexer
5454 , qualifier
5555 , uname
5656 , uname'
57+ , mname
5758 , reserved
5859 , symbol
5960 , symbol'
@@ -69,7 +70,7 @@ module Language.PureScript.Parser.Lexer
6970
7071import Prelude hiding (lex)
7172
72−import Control.Monad (void)
73+import Control.Monad (void, guard)
7374import Data.Functor.Identity
7475
7576import Control.Applicative
@@ -198,7 +199,7 @@ parseToken = P.choice
198199 , P.try $ P.char '@' *> P.notFollowedBy symbolChar *> pure At
199200 , LName <$> parseLName
200201 , do uName <- parseUName
201− (Qualifier uName <$ P.char '.') <|> pure (UName uName)
202+ (guard (validModuleName uName) >> Qualifier uName <$ P.char '.') <|> pure (UName uName)
202203 , Symbol <$> parseSymbol
203204 , StringLiteral <$> parseStringLiteral
204205 , Number <$> parseNumber
@@ -209,7 +210,7 @@ parseToken = P.choice
209210 parseLName = (:) <$> identStart <*> P.many identLetter
210211
211212 parseUName :: P.Parsec String u String
212− parseUName = (:) <$> P.upper <*> P.many P.alphaNum
213+ parseUName = (:) <$> P.upper <*> P.many uidentLetter
213214
214215 parseSymbol :: P.Parsec String u String
215216 parseSymbol = P.many1 symbolChar
@@ -219,7 +220,10 @@ parseToken = P.choice
219220
220221 identLetter :: P.Parsec String u Char
221222 identLetter = P.alphaNum <|> P.oneOf "_'"
222−
223+
224+ uidentLetter :: P.Parsec String u Char
225+ uidentLetter = P.alphaNum <|> P.char '_'
226+
223227 symbolChar :: P.Parsec String u Char
224228 symbolChar = P.oneOf opChars
225229
@@ -391,6 +395,12 @@ uname = token go P.<?> "proper name"
391395 go (UName s) = Just s
392396 go _ = Nothing
393397
398+mname :: TokenParser String
399+mname = token go P.<?> "module name"
400+ where
401+ go (UName s) | validModuleName s = Just s
402+ go _ = Nothing
403+
394404uname' :: String -> TokenParser ()
395405uname' s = token go P.<?> show s
396406 where
@@ -437,6 +447,9 @@ identifier = token go P.<?> "identifier"
437447 go (LName s) | s `notElem` reservedPsNames = Just s
438448 go _ = Nothing
439449
450+validModuleName :: String -> Bool
451+validModuleName s = not ('_' `elem` s)
452+
440453-- |
441454-- A list of purescript reserved identifiers
442455--