git.iko.soy/rowtype-yoga/purescript-native
on golang help sign in
Allow method calls and other expressions evaluating to {} in statements
5ff260bPhil Freeman
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 @@
1name: purescript
1name: purescript
2−version: 0.1.17
2+version: 0.1.18
3cabal-version: >=1.8
3cabal-version: >=1.8
4build-type: Simple
4build-type: Simple
5license: MIT
5license: MIT
src/Language/PureScript/CodeGen/JS.hs+1
@@ -165,4 +165,5 @@ statementToJs m e (If ifst) = ifToJs ifst
165 elseToJs :: ElseStatement -> JS
165 elseToJs :: ElseStatement -> JS
166 elseToJs (Else sts) = JSBlock (map (statementToJs m e) sts)
166 elseToJs (Else sts) = JSBlock (map (statementToJs m e) sts)
167 elseToJs (ElseIf elif) = ifToJs elif
167 elseToJs (ElseIf elif) = ifToJs elif
168+statementToJs m e (ValueStatement val) = valueToJs m e val
168statementToJs m e (Return value) = JSReturn (valueToJs m e value)
169statementToJs m e (Return value) = JSReturn (valueToJs m e value)
src/Language/PureScript/Parser/Values.hs+11−5
@@ -97,7 +97,7 @@ parseManyStatements = (do
97 return sts) P.<?> "block"
97 return sts) P.<?> "block"
98
98
99parseValueAtom :: P.Parsec String ParseState Value
99parseValueAtom :: P.Parsec String ParseState Value
100−parseValueAtom = C.indented *> P.choice
100+parseValueAtom = P.choice
101 [ P.try parseNumericLiteral
101 [ P.try parseNumericLiteral
102 , P.try parseStringLiteral
102 , P.try parseStringLiteral
103 , P.try parseBooleanLiteral
103 , P.try parseBooleanLiteral
@@ -153,8 +153,10 @@ parseVariableIntroduction = do
153
153
154parseAssignment :: P.Parsec String ParseState Statement
154parseAssignment :: P.Parsec String ParseState Statement
155parseAssignment = do
155parseAssignment = do
156+ tgt <- P.try $ do
156− tgt <- C.parseIdent
157+ tgt <- C.parseIdent
157− C.lexeme $ C.indented *> P.char '='
158+ C.lexeme $ C.indented *> P.char '='
159+ return tgt
158 value <- parseValue
160 value <- parseValue
159 C.indented *> C.semi
161 C.indented *> C.semi
160 return $ Assignment tgt value
162 return $ Assignment tgt value
@@ -187,18 +189,22 @@ parseElseStatement :: P.Parsec String ParseState ElseStatement
187parseElseStatement = C.reserved "else" >> (ElseIf <$> parseIfStatement
189parseElseStatement = C.reserved "else" >> (ElseIf <$> parseIfStatement
188 <|> Else <$> parseManyStatements)
190 <|> Else <$> parseManyStatements)
189
191
192+parseValueStatement :: P.Parsec String ParseState Statement
193+parseValueStatement = ValueStatement <$> (parseValue <* C.semi)
194+
190parseReturn :: P.Parsec String ParseState Statement
195parseReturn :: P.Parsec String ParseState Statement
191parseReturn = Return <$> (C.reserved "return" *> parseValue <* C.indented <* C.semi)
196parseReturn = Return <$> (C.reserved "return" *> parseValue <* C.indented <* C.semi)
192
197
193parseStatement :: P.Parsec String ParseState Statement
198parseStatement :: P.Parsec String ParseState Statement
194−parseStatement = P.choice (map P.try
199+parseStatement = P.choice
195 [ parseVariableIntroduction
200 [ parseVariableIntroduction
196 , parseAssignment
201 , parseAssignment
197 , parseWhile
202 , parseWhile
198 , parseFor
203 , parseFor
199 , parseForEach
204 , parseForEach
200 , parseIf
205 , parseIf
206+ , parseValueStatement
201− , parseReturn ]) P.<?> "statement"
207+ , parseReturn ] P.<?> "statement"
202
208
203parseStringBinder :: P.Parsec String ParseState Binder
209parseStringBinder :: P.Parsec String ParseState Binder
204parseStringBinder = StringBinder <$> C.stringLiteral
210parseStringBinder = StringBinder <$> C.stringLiteral
src/Language/PureScript/Pretty/Values.hs+1
@@ -175,6 +175,7 @@ prettyPrintStatement (ForEach ident arr sts) = "foreach " ++ show ident
175 ++ " in " ++ prettyPrintValue arr ++ ": {"
175 ++ " in " ++ prettyPrintValue arr ++ ": {"
176 ++ intercalate "; " (map prettyPrintStatement sts) ++ " }"
176 ++ intercalate "; " (map prettyPrintStatement sts) ++ " }"
177prettyPrintStatement (If ifst) = prettyPrintIfStatement ifst
177prettyPrintStatement (If ifst) = prettyPrintIfStatement ifst
178+prettyPrintStatement (ValueStatement val) = prettyPrintValue val
178prettyPrintStatement (Return value) = "return " ++ prettyPrintValue value
179prettyPrintStatement (Return value) = "return " ++ prettyPrintValue value
179
180
180prettyPrintIfStatement :: IfStatement -> String
181prettyPrintIfStatement :: IfStatement -> String
src/Language/PureScript/TypeChecker/Types.hs+3
@@ -536,6 +536,9 @@ checkStatement mass ret (ForEach ident vals inner) = do
536 (allCodePathsReturn, _) <- bindLocalVariables [(ident, val)] $ checkBlock mass ret inner
536 (allCodePathsReturn, _) <- bindLocalVariables [(ident, val)] $ checkBlock mass ret inner
537 guardWith "Cannot return from within a foreach block" $ not allCodePathsReturn
537 guardWith "Cannot return from within a foreach block" $ not allCodePathsReturn
538 return (False, mass)
538 return (False, mass)
539+checkStatement mass _ (ValueStatement val) = do
540+ check val unit
541+ return (False, mass)
539checkStatement mass ret (Return val) = do
542checkStatement mass ret (Return val) = do
540 check val ret
543 check val ret
541 return (True, mass)
544 return (True, mass)
src/Language/PureScript/Types.hs+3
@@ -68,3 +68,6 @@ isPolyType _ = True
68
68
69mkForAll :: [String] -> Type -> Type
69mkForAll :: [String] -> Type -> Type
70mkForAll = flip . foldl . flip $ ForAll
70mkForAll = flip . foldl . flip $ ForAll
71+
72+unit :: Type
73+unit = Object REmpty
src/Language/PureScript/Values.hs+1
@@ -77,6 +77,7 @@ data Statement
77 | For Ident Value Value [Statement]
77 | For Ident Value Value [Statement]
78 | ForEach Ident Value [Statement]
78 | ForEach Ident Value [Statement]
79 | If IfStatement
79 | If IfStatement
80+ | ValueStatement Value
80 | Return Value deriving (Show, Data, Typeable)
81 | Return Value deriving (Show, Data, Typeable)
81
82
82data IfStatement = IfStatement Value [Statement] (Maybe ElseStatement) deriving (Show, Data, Typeable)
83data IfStatement = IfStatement Value [Statement] (Maybe ElseStatement) deriving (Show, Data, Typeable)