git.iko.soy/rowtype-yoga/purescript-native
on golang help sign in
Merge pull request #2167 from purescript/primed-types
bbd5a83Gary Burgess
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
16
16
17import qualified Text.Parsec as P
17import qualified Text.Parsec as P
18
18
19+-- |
20+-- Parse a general proper name.
21+--
19properName :: TokenParser (ProperName a)
22properName :: TokenParser (ProperName a)
20properName = ProperName <$> uname
23properName = ProperName <$> uname
21
24
25+-- |
26+-- Parse a proper name for a type.
27+--
28+typeName :: TokenParser (ProperName 'TypeName)
29+typeName = ProperName <$> tyname
30+
22-- |
31-- |
23-- Parse a module name
32-- Parse a module name
24--
33--
src/Language/PureScript/Parser/Declarations.hs+5−5
@@ -66,7 +66,7 @@ kindedIdent = (, Nothing) <$> identifier
66parseDataDeclaration :: TokenParser Declaration
66parseDataDeclaration :: TokenParser Declaration
67parseDataDeclaration = do
67parseDataDeclaration = do
68 dtype <- (reserved "data" *> return Data) <|> (reserved "newtype" *> return Newtype)
68 dtype <- (reserved "data" *> return Data) <|> (reserved "newtype" *> return Newtype)
69− name <- indented *> properName
69+ name <- indented *> typeName
70 tyArgs <- many (indented *> kindedIdent)
70 tyArgs <- many (indented *> kindedIdent)
71 ctors <- P.option [] $ do
71 ctors <- P.option [] $ do
72 indented *> equals
72 indented *> equals
@@ -80,7 +80,7 @@ parseTypeDeclaration =
80
80
81parseTypeSynonymDeclaration :: TokenParser Declaration
81parseTypeSynonymDeclaration :: TokenParser Declaration
82parseTypeSynonymDeclaration =
82parseTypeSynonymDeclaration =
83− TypeSynonymDeclaration <$> (reserved "type" *> indented *> properName)
83+ TypeSynonymDeclaration <$> (reserved "type" *> indented *> typeName)
84 <*> many (indented *> kindedIdent)
84 <*> many (indented *> kindedIdent)
85 <*> (indented *> equals *> noWildcards parsePolyType)
85 <*> (indented *> equals *> noWildcards parsePolyType)
86
86
@@ -108,7 +108,7 @@ parseValueDeclaration = do
108
108
109parseExternDeclaration :: TokenParser Declaration
109parseExternDeclaration :: TokenParser Declaration
110parseExternDeclaration = reserved "foreign" *> indented *> reserved "import" *> indented *>
110parseExternDeclaration = reserved "foreign" *> indented *> reserved "import" *> indented *>
111− (ExternDataDeclaration <$> (reserved "data" *> indented *> properName)
111+ (ExternDataDeclaration <$> (reserved "data" *> indented *> typeName)
112 <*> (indented *> doubleColon *> parseKind)
112 <*> (indented *> doubleColon *> parseKind)
113 <|> (do ident <- parseIdent
113 <|> (do ident <- parseIdent
114 ty <- indented *> doubleColon *> noWildcards parsePolyType
114 ty <- indented *> doubleColon *> noWildcards parsePolyType
@@ -132,7 +132,7 @@ parseFixityDeclaration = do
132 where
132 where
133 typeFixity fixity =
133 typeFixity fixity =
134 TypeFixity fixity
134 TypeFixity fixity
135− <$> (reserved "type" *> parseQualified properName)
135+ <$> (reserved "type" *> parseQualified typeName)
136 <*> (reserved "as" *> parseOperator)
136 <*> (reserved "as" *> parseOperator)
137 valueFixity fixity =
137 valueFixity fixity =
138 ValueFixity fixity
138 ValueFixity fixity
@@ -169,7 +169,7 @@ parseDeclarationRef =
169 <|> (TypeOpRef <$> (indented *> reserved "type" *> parens parseOperator))
169 <|> (TypeOpRef <$> (indented *> reserved "type" *> parens parseOperator))
170 where
170 where
171 parseTypeRef = do
171 parseTypeRef = do
172− name <- properName
172+ name <- typeName
173 dctors <- P.optionMaybe $ parens (symbol' ".." *> pure Nothing <|> Just <$> commaSep properName)
173 dctors <- P.optionMaybe $ parens (symbol' ".." *> pure Nothing <|> Just <$> commaSep properName)
174 return $ TypeRef name (fromMaybe (Just []) dctors)
174 return $ TypeRef name (fromMaybe (Just []) dctors)
175
175
src/Language/PureScript/Parser/Lexer.hs+14−13
@@ -41,8 +41,8 @@ module Language.PureScript.Parser.Lexer
41 , commaSep1
41 , commaSep1
42 , lname
42 , lname
43 , qualifier
43 , qualifier
44+ , tyname
44 , uname
45 , uname
45− , uname'
46 , mname
46 , mname
47 , reserved
47 , reserved
48 , symbol
48 , symbol
@@ -213,8 +213,9 @@ parseToken = P.choice
213 , P.try $ P.char '_' *> P.notFollowedBy identLetter *> pure Underscore
213 , P.try $ P.char '_' *> P.notFollowedBy identLetter *> pure Underscore
214 , HoleLit <$> P.try (P.char '?' *> P.many1 identLetter)
214 , HoleLit <$> P.try (P.char '?' *> P.many1 identLetter)
215 , LName <$> parseLName
215 , LName <$> parseLName
216− , do uName <- parseUName
216+ , parseUName >>= \uName ->
217− (guard (validModuleName uName) >> Qualifier uName <$ P.char '.') <|> pure (UName uName)
217+ (guard (validModuleName uName) >> Qualifier uName <$ P.char '.')
218+ <|> pure (UName uName)
218 , Symbol <$> parseSymbol
219 , Symbol <$> parseSymbol
219 , CharLiteral <$> parseCharLiteral
220 , CharLiteral <$> parseCharLiteral
220 , StringLiteral <$> parseStringLiteral
221 , StringLiteral <$> parseStringLiteral
@@ -226,7 +227,7 @@ parseToken = P.choice
226 parseLName = (:) <$> identStart <*> P.many identLetter
227 parseLName = (:) <$> identStart <*> P.many identLetter
227
228
228 parseUName :: P.Parsec String u String
229 parseUName :: P.Parsec String u String
229− parseUName = (:) <$> P.upper <*> P.many uidentLetter
230+ parseUName = (:) <$> P.upper <*> P.many identLetter
230
231
231 parseSymbol :: P.Parsec String u String
232 parseSymbol :: P.Parsec String u String
232 parseSymbol = P.many1 symbolChar
233 parseSymbol = P.many1 symbolChar
@@ -237,9 +238,6 @@ parseToken = P.choice
237 identLetter :: P.Parsec String u Char
238 identLetter :: P.Parsec String u Char
238 identLetter = P.alphaNum <|> P.oneOf "_'"
239 identLetter = P.alphaNum <|> P.oneOf "_'"
239
240
240− uidentLetter :: P.Parsec String u Char
241− uidentLetter = P.alphaNum <|> P.char '_'
242−
243 symbolChar :: P.Parsec String u Char
241 symbolChar :: P.Parsec String u Char
244 symbolChar = P.satisfy isSymbolChar
242 symbolChar = P.satisfy isSymbolChar
245
243
@@ -430,6 +428,12 @@ reserved s = token go P.<?> show s
430
428
431uname :: TokenParser String
429uname :: TokenParser String
432uname = token go P.<?> "proper name"
430uname = 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"
433 where
437 where
434 go (UName s) = Just s
438 go (UName s) = Just s
435 go _ = Nothing
439 go _ = Nothing
@@ -440,12 +444,6 @@ mname = token go P.<?> "module name"
440 go (UName s) | validModuleName s = Just s
444 go (UName s) | validModuleName s = Just s
441 go _ = Nothing
445 go _ = Nothing
442
446
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−
449symbol :: TokenParser String
447symbol :: TokenParser String
450symbol = token go P.<?> "symbol"
448symbol = token go P.<?> "symbol"
451 where
449 where
@@ -496,6 +494,9 @@ identifier = token go P.<?> "identifier"
496validModuleName :: String -> Bool
494validModuleName :: String -> Bool
497validModuleName s = '_' `notElem` s
495validModuleName s = '_' `notElem` s
498
496
497+validUName :: String -> Bool
498+validUName s = '\'' `notElem` s
499+
499-- |
500-- |
500-- A list of purescript reserved identifiers
501-- A list of purescript reserved identifiers
501--
502--
src/Language/PureScript/Parser/Types.hs+1−1
@@ -40,7 +40,7 @@ parseTypeVariable = do
40 return $ TypeVar ident
40 return $ TypeVar ident
41
41
42parseTypeConstructor :: TokenParser Type
42parseTypeConstructor :: TokenParser Type
43−parseTypeConstructor = TypeConstructor <$> parseQualified properName
43+parseTypeConstructor = TypeConstructor <$> parseQualified typeName
44
44
45parseForAll :: TokenParser Type
45parseForAll :: TokenParser Type
46parseForAll = mkForAll <$> ((reserved "forall" <|> reserved "∀") *> P.many1 (indented *> identifier) <* indented <* dot)
46parseForAll = mkForAll <$> ((reserved "forall" <|> reserved "∀") *> P.many1 (indented *> identifier) <* indented <* dot)