git.iko.soy/rowtype-yoga/purescript-native
on golang help sign in
Allow method calls and other expressions evaluating to {} in statements
commit5ff260bd5a5aa380a30f771dd56994918ee93f29 authorPhil Freeman <paf31@cantab.net> dateSun 22 Dec 2013, 15:05 (13 years ago) parent67df3cd
8 files changed+27−6
examples/passing/MethodCall.purs+6 purescript.cabal+1−1 src/Language/PureScript/CodeGen/JS.hs+1 src/Language/PureScript/Parser/Values.hs+11−5 src/Language/PureScript/Pretty/Values.hs+1 src/Language/PureScript/TypeChecker/Types.hs+3 src/Language/PureScript/Types.hs+3 src/Language/PureScript/Values.hs+1
examples/passing/MethodCall.pursnew file+6
@@ -0,0 +1,6 @@
1+foreign import foo :: () -> {}
2+
3+test = {
4+ foo();
5+ return 0;
6+ }
purescript.cabal+1−1
@@ -1,5 +1,5 @@
11name: purescript
2−version: 0.1.17
2+version: 0.1.18
33cabal-version: >=1.8
44build-type: Simple
55license: MIT
src/Language/PureScript/CodeGen/JS.hs+1
@@ -165,4 +165,5 @@ statementToJs m e (If ifst) = ifToJs ifst
165165 elseToJs :: ElseStatement -> JS
166166 elseToJs (Else sts) = JSBlock (map (statementToJs m e) sts)
167167 elseToJs (ElseIf elif) = ifToJs elif
168+statementToJs m e (ValueStatement val) = valueToJs m e val
168169statementToJs m e (Return value) = JSReturn (valueToJs m e value)
src/Language/PureScript/Parser/Values.hs+11−5
@@ -97,7 +97,7 @@ parseManyStatements = (do
9797 return sts) P.<?> "block"
9898
9999parseValueAtom :: P.Parsec String ParseState Value
100−parseValueAtom = C.indented *> P.choice
100+parseValueAtom = P.choice
101101 [ P.try parseNumericLiteral
102102 , P.try parseStringLiteral
103103 , P.try parseBooleanLiteral
@@ -153,8 +153,10 @@ parseVariableIntroduction = do
153153
154154parseAssignment :: P.Parsec String ParseState Statement
155155parseAssignment = do
156− tgt <- C.parseIdent
157− C.lexeme $ C.indented *> P.char '='
156+ tgt <- P.try $ do
157+ tgt <- C.parseIdent
158+ C.lexeme $ C.indented *> P.char '='
159+ return tgt
158160 value <- parseValue
159161 C.indented *> C.semi
160162 return $ Assignment tgt value
@@ -187,18 +189,22 @@ parseElseStatement :: P.Parsec String ParseState ElseStatement
187189parseElseStatement = C.reserved "else" >> (ElseIf <$> parseIfStatement
188190 <|> Else <$> parseManyStatements)
189191
192+parseValueStatement :: P.Parsec String ParseState Statement
193+parseValueStatement = ValueStatement <$> (parseValue <* C.semi)
194+
190195parseReturn :: P.Parsec String ParseState Statement
191196parseReturn = Return <$> (C.reserved "return" *> parseValue <* C.indented <* C.semi)
192197
193198parseStatement :: P.Parsec String ParseState Statement
194−parseStatement = P.choice (map P.try
199+parseStatement = P.choice
195200 [ parseVariableIntroduction
196201 , parseAssignment
197202 , parseWhile
198203 , parseFor
199204 , parseForEach
200205 , parseIf
201− , parseReturn ]) P.<?> "statement"
206+ , parseValueStatement
207+ , parseReturn ] P.<?> "statement"
202208
203209parseStringBinder :: P.Parsec String ParseState Binder
204210parseStringBinder = StringBinder <$> C.stringLiteral
src/Language/PureScript/Pretty/Values.hs+1
@@ -175,6 +175,7 @@ prettyPrintStatement (ForEach ident arr sts) = "foreach " ++ show ident
175175 ++ " in " ++ prettyPrintValue arr ++ ": {"
176176 ++ intercalate "; " (map prettyPrintStatement sts) ++ " }"
177177prettyPrintStatement (If ifst) = prettyPrintIfStatement ifst
178+prettyPrintStatement (ValueStatement val) = prettyPrintValue val
178179prettyPrintStatement (Return value) = "return " ++ prettyPrintValue value
179180
180181prettyPrintIfStatement :: IfStatement -> String
src/Language/PureScript/TypeChecker/Types.hs+3
@@ -536,6 +536,9 @@ checkStatement mass ret (ForEach ident vals inner) = do
536536 (allCodePathsReturn, _) <- bindLocalVariables [(ident, val)] $ checkBlock mass ret inner
537537 guardWith "Cannot return from within a foreach block" $ not allCodePathsReturn
538538 return (False, mass)
539+checkStatement mass _ (ValueStatement val) = do
540+ check val unit
541+ return (False, mass)
539542checkStatement mass ret (Return val) = do
540543 check val ret
541544 return (True, mass)
src/Language/PureScript/Types.hs+3
@@ -68,3 +68,6 @@ isPolyType _ = True
6868
6969mkForAll :: [String] -> Type -> Type
7070mkForAll = flip . foldl . flip $ ForAll
71+
72+unit :: Type
73+unit = Object REmpty
src/Language/PureScript/Values.hs+1
@@ -77,6 +77,7 @@ data Statement
7777 | For Ident Value Value [Statement]
7878 | ForEach Ident Value [Statement]
7979 | If IfStatement
80+ | ValueStatement Value
8081 | Return Value deriving (Show, Data, Typeable)
8182
8283data IfStatement = IfStatement Value [Statement] (Maybe ElseStatement) deriving (Show, Data, Typeable)