Skip to content

Commit bbd5a83

Browse files
committed
Merge pull request purescript#2167 from purescript/primed-types
Allow use of prime symbol in type names.
2 parents 83be9a5 + 0619bd5 commit bbd5a83

File tree

5 files changed

+49
-19
lines changed

5 files changed

+49
-19
lines changed
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -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 eqTEq 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

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,9 +16,18 @@ import Language.PureScript.Parser.State
1616

1717
import qualified Text.Parsec as P
1818

19+
-- |
20+
-- Parse a general proper name.
21+
--
1922
properName :: TokenParser (ProperName a)
2023
properName = 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

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,7 @@ kindedIdent = (, Nothing) <$> identifier
6666
parseDataDeclaration :: TokenParser Declaration
6767
parseDataDeclaration = 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

8181
parseTypeSynonymDeclaration :: TokenParser Declaration
8282
parseTypeSynonymDeclaration =
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

109109
parseExternDeclaration :: TokenParser Declaration
110110
parseExternDeclaration = 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

Lines changed: 14 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -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

431429
uname :: TokenParser String
432430
uname = 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-
449447
symbol :: TokenParser String
450448
symbol = token go P.<?> "symbol"
451449
where
@@ -496,6 +494,9 @@ identifier = token go P.<?> "identifier"
496494
validModuleName :: String -> Bool
497495
validModuleName 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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ parseTypeVariable = do
4040
return $ TypeVar ident
4141

4242
parseTypeConstructor :: TokenParser Type
43-
parseTypeConstructor = TypeConstructor <$> parseQualified properName
43+
parseTypeConstructor = TypeConstructor <$> parseQualified typeName
4444

4545
parseForAll :: TokenParser Type
4646
parseForAll = mkForAll <$> ((reserved "forall" <|> reserved "") *> P.many1 (indented *> identifier) <* indented <* dot)

0 commit comments

Comments
 (0)