git.iko.soy/rowtype-yoga/purescript-native
on golang help sign in
Allow use of prime symbol in type names.
commit0619bd562eeebc0d9a04e50b3960bd194bbb932a authorGary Burgess <gary.burgess@gmail.com> dateSat 28 May 2016, 00:18 (10 years ago) parent83be9a5
5 files changed+49−19
examples/passing/PrimedTypeName.purs+20 src/Language/PureScript/Parser/Common.hs+9 src/Language/PureScript/Parser/Declarations.hs+5−5 src/Language/PureScript/Parser/Lexer.hs+14−13 src/Language/PureScript/Parser/Types.hs+1−1
examples/passing/PrimedTypeName.pursnew file+20
@@ -0,0 +1,20 @@
1+module Main (T, T', T'', T''', main) where
2+
3+import Prelude
4+import Control.Monad.Eff.Console (log)
5+
6+data T a = T
7+type T' = T Unit
8+
9+data T'' = TP
10+
11+foreign import data T''' ∷ *
12+
13+instance eqT ∷ Eq T'' where
14+ eq _ _ = true
15+
16+type A' a b = b → a
17+
18+infixr 4 type A' as ↫
19+
20+main = log "Done"
src/Language/PureScript/Parser/Common.hs+9
@@ -16,9 +16,18 @@ import Language.PureScript.Parser.State
1616
1717import qualified Text.Parsec as P
1818
19+-- |
20+-- Parse a general proper name.
21+--
1922properName :: TokenParser (ProperName a)
2023properName = ProperName <$> uname
2124
25+-- |
26+-- Parse a proper name for a type.
27+--
28+typeName :: TokenParser (ProperName 'TypeName)
29+typeName = ProperName <$> tyname
30+
2231-- |
2332-- Parse a module name
2433--
src/Language/PureScript/Parser/Declarations.hs+5−5
@@ -66,7 +66,7 @@ kindedIdent = (, Nothing) <$> identifier
6666parseDataDeclaration :: TokenParser Declaration
6767parseDataDeclaration = do
6868 dtype <- (reserved "data" *> return Data) <|> (reserved "newtype" *> return Newtype)
69− name <- indented *> properName
69+ name <- indented *> typeName
7070 tyArgs <- many (indented *> kindedIdent)
7171 ctors <- P.option [] $ do
7272 indented *> equals
@@ -80,7 +80,7 @@ parseTypeDeclaration =
8080
8181parseTypeSynonymDeclaration :: TokenParser Declaration
8282parseTypeSynonymDeclaration =
83− TypeSynonymDeclaration <$> (reserved "type" *> indented *> properName)
83+ TypeSynonymDeclaration <$> (reserved "type" *> indented *> typeName)
8484 <*> many (indented *> kindedIdent)
8585 <*> (indented *> equals *> noWildcards parsePolyType)
8686
@@ -108,7 +108,7 @@ parseValueDeclaration = do
108108
109109parseExternDeclaration :: TokenParser Declaration
110110parseExternDeclaration = reserved "foreign" *> indented *> reserved "import" *> indented *>
111− (ExternDataDeclaration <$> (reserved "data" *> indented *> properName)
111+ (ExternDataDeclaration <$> (reserved "data" *> indented *> typeName)
112112 <*> (indented *> doubleColon *> parseKind)
113113 <|> (do ident <- parseIdent
114114 ty <- indented *> doubleColon *> noWildcards parsePolyType
@@ -132,7 +132,7 @@ parseFixityDeclaration = do
132132 where
133133 typeFixity fixity =
134134 TypeFixity fixity
135− <$> (reserved "type" *> parseQualified properName)
135+ <$> (reserved "type" *> parseQualified typeName)
136136 <*> (reserved "as" *> parseOperator)
137137 valueFixity fixity =
138138 ValueFixity fixity
@@ -169,7 +169,7 @@ parseDeclarationRef =
169169 <|> (TypeOpRef <$> (indented *> reserved "type" *> parens parseOperator))
170170 where
171171 parseTypeRef = do
172− name <- properName
172+ name <- typeName
173173 dctors <- P.optionMaybe $ parens (symbol' ".." *> pure Nothing <|> Just <$> commaSep properName)
174174 return $ TypeRef name (fromMaybe (Just []) dctors)
175175
src/Language/PureScript/Parser/Lexer.hs+14−13
@@ -41,8 +41,8 @@ module Language.PureScript.Parser.Lexer
4141 , commaSep1
4242 , lname
4343 , qualifier
44+ , tyname
4445 , uname
45− , uname'
4646 , mname
4747 , reserved
4848 , symbol
@@ -213,8 +213,9 @@ parseToken = P.choice
213213 , P.try $ P.char '_' *> P.notFollowedBy identLetter *> pure Underscore
214214 , HoleLit <$> P.try (P.char '?' *> P.many1 identLetter)
215215 , LName <$> parseLName
216− , do uName <- parseUName
217− (guard (validModuleName uName) >> Qualifier uName <$ P.char '.') <|> pure (UName uName)
216+ , parseUName >>= \uName ->
217+ (guard (validModuleName uName) >> Qualifier uName <$ P.char '.')
218+ <|> pure (UName uName)
218219 , Symbol <$> parseSymbol
219220 , CharLiteral <$> parseCharLiteral
220221 , StringLiteral <$> parseStringLiteral
@@ -226,7 +227,7 @@ parseToken = P.choice
226227 parseLName = (:) <$> identStart <*> P.many identLetter
227228
228229 parseUName :: P.Parsec String u String
229− parseUName = (:) <$> P.upper <*> P.many uidentLetter
230+ parseUName = (:) <$> P.upper <*> P.many identLetter
230231
231232 parseSymbol :: P.Parsec String u String
232233 parseSymbol = P.many1 symbolChar
@@ -237,9 +238,6 @@ parseToken = P.choice
237238 identLetter :: P.Parsec String u Char
238239 identLetter = P.alphaNum <|> P.oneOf "_'"
239240
240− uidentLetter :: P.Parsec String u Char
241− uidentLetter = P.alphaNum <|> P.char '_'
242−
243241 symbolChar :: P.Parsec String u Char
244242 symbolChar = P.satisfy isSymbolChar
245243
@@ -430,6 +428,12 @@ reserved s = token go P.<?> show s
430428
431429uname :: TokenParser String
432430uname = token go P.<?> "proper name"
431+ where
432+ go (UName s) | validUName s = Just s
433+ go _ = Nothing
434+
435+tyname :: TokenParser String
436+tyname = token go P.<?> "type name"
433437 where
434438 go (UName s) = Just s
435439 go _ = Nothing
@@ -440,12 +444,6 @@ mname = token go P.<?> "module name"
440444 go (UName s) | validModuleName s = Just s
441445 go _ = Nothing
442446
443−uname' :: String -> TokenParser ()
444−uname' s = token go P.<?> show s
445− where
446− go (UName s') | s == s' = Just ()
447− go _ = Nothing
448−
449447symbol :: TokenParser String
450448symbol = token go P.<?> "symbol"
451449 where
@@ -496,6 +494,9 @@ identifier = token go P.<?> "identifier"
496494validModuleName :: String -> Bool
497495validModuleName s = '_' `notElem` s
498496
497+validUName :: String -> Bool
498+validUName s = '\'' `notElem` s
499+
499500-- |
500501-- A list of purescript reserved identifiers
501502--
src/Language/PureScript/Parser/Types.hs+1−1
@@ -40,7 +40,7 @@ parseTypeVariable = do
4040 return $ TypeVar ident
4141
4242parseTypeConstructor :: TokenParser Type
43−parseTypeConstructor = TypeConstructor <$> parseQualified properName
43+parseTypeConstructor = TypeConstructor <$> parseQualified typeName
4444
4545parseForAll :: TokenParser Type
4646parseForAll = mkForAll <$> ((reserved "forall" <|> reserved "∀") *> P.many1 (indented *> identifier) <* indented <* dot)