git.iko.soy/rowtype-yoga/purescript-native
on golang help sign in
Disallow array index and object property updates in blocks.
2302594Phil Freeman
examples/passing/NamedPatterns.ps+1−4
@@ -1,6 +1,3 @@
1foo = \x -> case x of
1foo = \x -> case x of
2 y@{ foo = "Foo" } -> y
2 y@{ foo = "Foo" } -> y
3− y -> (do
3+ y -> y
4− var copy = y
5− copy.foo = "Bar"
6− return copy)
src/PureScript/CodeGen/JS.hs+1−6
@@ -201,7 +201,7 @@ objectPropertyToJs (key, value) = key ++ ":" ++ valueToJs value
201
201
202statementToJs :: Statement -> String
202statementToJs :: Statement -> String
203statementToJs (VariableIntroduction ident value) = "var " ++ identToJs ident ++ " = " ++ valueToJs value
203statementToJs (VariableIntroduction ident value) = "var " ++ identToJs ident ++ " = " ++ valueToJs value
204−statementToJs (Assignment target value) = assignmentTargetToJs target ++ " = " ++ valueToJs value
204+statementToJs (Assignment target value) = identToJs target ++ " = " ++ valueToJs value
205statementToJs (While cond sts) = "while ("
205statementToJs (While cond sts) = "while ("
206 ++ valueToJs cond ++ ") {"
206 ++ valueToJs cond ++ ") {"
207 ++ intercalate ";" (map statementToJs sts) ++ "}"
207 ++ intercalate ";" (map statementToJs sts) ++ "}"
@@ -226,8 +226,3 @@ ifStatementToJs (IfStatement cond thens elst) =
226elseStatementToJs :: ElseStatement -> String
226elseStatementToJs :: ElseStatement -> String
227elseStatementToJs (Else sts) = " else {" ++ intercalate ";" (map statementToJs sts) ++ "}"
227elseStatementToJs (Else sts) = " else {" ++ intercalate ";" (map statementToJs sts) ++ "}"
228elseStatementToJs (ElseIf ifst) = " else " ++ ifStatementToJs ifst
228elseStatementToJs (ElseIf ifst) = " else " ++ ifStatementToJs ifst
229−
230−assignmentTargetToJs :: AssignmentTarget -> String
231−assignmentTargetToJs (AssignVariable ident) = identToJs ident
232−assignmentTargetToJs (AssignArrayIndex index tgt) = assignmentTargetToJs tgt ++ "[" ++ valueToJs index ++ "]"
233−assignmentTargetToJs (AssignObjectProperty prop tgt) = assignmentTargetToJs tgt ++ "." ++ prop
src/PureScript/CodeGen/Pretty/Values.hs+2−8
@@ -14,8 +14,7 @@
14
14
15module PureScript.CodeGen.Pretty.Values (
15module PureScript.CodeGen.Pretty.Values (
16 prettyPrintValue,
16 prettyPrintValue,
17− prettyPrintBinder,
17+ prettyPrintBinder
18− prettyPrintAssignmentTarget
19) where
18) where
20
19
21import Data.Char
20import Data.Char
@@ -155,7 +154,7 @@ prettyPrintObjectProperty key value = key ++ ": " ++ prettyPrintValue value
155
154
156prettyPrintStatement :: Statement -> String
155prettyPrintStatement :: Statement -> String
157prettyPrintStatement (VariableIntroduction ident value) = "var " ++ show ident ++ " = " ++ prettyPrintValue value
156prettyPrintStatement (VariableIntroduction ident value) = "var " ++ show ident ++ " = " ++ prettyPrintValue value
158−prettyPrintStatement (Assignment target value) = prettyPrintAssignmentTarget target ++ " = " ++ prettyPrintValue value
157+prettyPrintStatement (Assignment target value) = show target ++ " = " ++ prettyPrintValue value
159prettyPrintStatement (While cond sts) = "while " ++ prettyPrintValue cond ++ ": {" ++ intercalate ";" (map prettyPrintStatement sts) ++ " }"
158prettyPrintStatement (While cond sts) = "while " ++ prettyPrintValue cond ++ ": {" ++ intercalate ";" (map prettyPrintStatement sts) ++ " }"
160prettyPrintStatement (For ident start end sts) = "for " ++ show ident
159prettyPrintStatement (For ident start end sts) = "for " ++ show ident
161 ++ " <- " ++ prettyPrintValue start
160 ++ " <- " ++ prettyPrintValue start
@@ -177,8 +176,3 @@ prettyPrintIfStatement (IfStatement cond thens elst) =
177prettyPrintElseStatement :: ElseStatement -> String
176prettyPrintElseStatement :: ElseStatement -> String
178prettyPrintElseStatement (Else sts) = "else: {" ++ intercalate "; " (map prettyPrintStatement sts) ++ " }"
177prettyPrintElseStatement (Else sts) = "else: {" ++ intercalate "; " (map prettyPrintStatement sts) ++ " }"
179prettyPrintElseStatement (ElseIf ifst) = "else " ++ prettyPrintIfStatement ifst
178prettyPrintElseStatement (ElseIf ifst) = "else " ++ prettyPrintIfStatement ifst
180−
181−prettyPrintAssignmentTarget :: AssignmentTarget -> String
182−prettyPrintAssignmentTarget (AssignVariable ident) = identToJs ident
183−prettyPrintAssignmentTarget (AssignArrayIndex index tgt) = prettyPrintAssignmentTarget tgt ++ "[" ++ prettyPrintValue index ++ "]"
184−prettyPrintAssignmentTarget (AssignObjectProperty prop tgt) = prettyPrintAssignmentTarget tgt ++ "." ++ prop
src/PureScript/Parser/Values.hs+1−7
@@ -178,7 +178,7 @@ parseVariableIntroduction = do
178
178
179parseAssignment :: P.Parsec String ParseState Statement
179parseAssignment :: P.Parsec String ParseState Statement
180parseAssignment = do
180parseAssignment = do
181− tgt <- parseAssignmentTarget
181+ tgt <- C.parseIdent
182 C.lexeme $ C.indented *> P.char '='
182 C.lexeme $ C.indented *> P.char '='
183 value <- parseValue
183 value <- parseValue
184 return $ Assignment tgt value
184 return $ Assignment tgt value
@@ -279,9 +279,3 @@ parseBinder = P.choice (map P.try
279
279
280parseGuardedBinder :: P.Parsec String ParseState Binder
280parseGuardedBinder :: P.Parsec String ParseState Binder
281parseGuardedBinder = flip ($) <$> parseBinder <*> P.option id (GuardedBinder <$> (C.indented *> C.lexeme (P.char '|') *> C.indented *> parseValue))
281parseGuardedBinder = flip ($) <$> parseBinder <*> P.option id (GuardedBinder <$> (C.indented *> C.lexeme (P.char '|') *> C.indented *> parseValue))
282−
283−parseAssignmentTarget :: P.Parsec String ParseState AssignmentTarget
284−parseAssignmentTarget = buildExpressionParser operators (AssignVariable <$> C.parseIdent)
285− where
286− operators = [ [ Postfix $ AssignArrayIndex <$> (C.indented *> C.squares parseValue)
287− , Postfix $ AssignObjectProperty <$> (C.indented *> C.dot *> C.indented *> C.identifier) ] ]
src/PureScript/TypeChecker/Types.hs+7−22
@@ -48,12 +48,12 @@ import qualified Data.Map as M
48data TypeConstraintOrigin
48data TypeConstraintOrigin
49 = ValueOrigin Value
49 = ValueOrigin Value
50 | BinderOrigin Binder
50 | BinderOrigin Binder
51− | AssignmentTargetOrigin AssignmentTarget deriving (Show, D.Data, D.Typeable)
51+ | AssignmentTargetOrigin Ident deriving (Show, D.Data, D.Typeable)
52
52
53prettyPrintOrigin :: TypeConstraintOrigin -> String
53prettyPrintOrigin :: TypeConstraintOrigin -> String
54prettyPrintOrigin (ValueOrigin val) = prettyPrintValue val
54prettyPrintOrigin (ValueOrigin val) = prettyPrintValue val
55prettyPrintOrigin (BinderOrigin binder) = prettyPrintBinder binder
55prettyPrintOrigin (BinderOrigin binder) = prettyPrintBinder binder
56−prettyPrintOrigin (AssignmentTargetOrigin assign) = prettyPrintAssignmentTarget assign
56+prettyPrintOrigin (AssignmentTargetOrigin ident) = show ident
57
57
58data TypeConstraint
58data TypeConstraint
59 = TypeConstraint Int Type TypeConstraintOrigin
59 = TypeConstraint Int Type TypeConstraintOrigin
@@ -428,10 +428,12 @@ typeConstraintsForStatement m mass ret (VariableIntroduction name val) = do
428 assignVariable name (m `M.union` mass)
428 assignVariable name (m `M.union` mass)
429 (cs1, n1) <- typeConstraints m val
429 (cs1, n1) <- typeConstraints m val
430 return $ (cs1, False, M.insert name n1 mass)
430 return $ (cs1, False, M.insert name n1 mass)
431−typeConstraintsForStatement m mass ret (Assignment tgt val) = do
431+typeConstraintsForStatement m mass ret (Assignment ident val) = do
432 (cs1, n1) <- typeConstraints m val
432 (cs1, n1) <- typeConstraints m val
433− cs2 <- typeConstraintsForAssignmentTarget m mass n1 tgt
433+ case M.lookup ident mass of
434− return (cs1 ++ cs2, False, mass)
434+ Nothing -> throwError $ "No local variable with name " ++ show ident
435+ Just ty -> do
436+ return (TypeConstraint n1 (TUnknown ty) (AssignmentTargetOrigin ident) : cs1, False, mass)
435typeConstraintsForStatement m mass ret (While val inner) = do
437typeConstraintsForStatement m mass ret (While val inner) = do
436 (cs1, n1) <- typeConstraints m val
438 (cs1, n1) <- typeConstraints m val
437 (cs2, allCodePathsReturn, _) <- typeConstraintsForBlock m mass ret inner
439 (cs2, allCodePathsReturn, _) <- typeConstraintsForBlock m mass ret inner
@@ -477,23 +479,6 @@ typeConstraintsForElseStatement m mass ret (ElseIf ifst) = do
477 (cs, allCodePathsReturn) <- typeConstraintsForIfStatement m mass ret ifst
479 (cs, allCodePathsReturn) <- typeConstraintsForIfStatement m mass ret ifst
478 return (cs, allCodePathsReturn)
480 return (cs, allCodePathsReturn)
479
481
480−typeConstraintsForAssignmentTarget :: M.Map Ident Int -> M.Map Ident Int -> Int -> AssignmentTarget -> Check [TypeConstraint]
481−typeConstraintsForAssignmentTarget m mass nval a@(AssignVariable var) =
482− case M.lookup var mass of
483− Nothing -> throwError $ "No local variable with name " ++ show var
484− Just ty -> do
485− return [TypeConstraint nval (TUnknown ty) (AssignmentTargetOrigin a)]
486−typeConstraintsForAssignmentTarget m mass nval a@(AssignArrayIndex index tgt) = do
487− arr <- fresh
488− (cs1, n1) <- typeConstraints (m `M.union` mass) index
489− cs2 <- typeConstraintsForAssignmentTarget m mass arr tgt
490− return $ (TypeConstraint arr (Array (TUnknown nval)) (AssignmentTargetOrigin a)) : (TypeConstraint n1 Number (ValueOrigin index)) : cs1 ++ cs2
491−typeConstraintsForAssignmentTarget m mass nval a@(AssignObjectProperty prop tgt) = do
492− obj <- fresh
493− row <- fresh
494− cs <- typeConstraintsForAssignmentTarget m mass obj tgt
495− return $ (TypeConstraint obj (Object (RCons prop (TUnknown nval) $ RUnknown row)) (AssignmentTargetOrigin a)) : cs
496−
497typeConstraintsForBlock :: M.Map Ident Int -> M.Map Ident Int -> Int -> [Statement] -> Check ([TypeConstraint], Bool, M.Map Ident Int)
482typeConstraintsForBlock :: M.Map Ident Int -> M.Map Ident Int -> Int -> [Statement] -> Check ([TypeConstraint], Bool, M.Map Ident Int)
498typeConstraintsForBlock _ mass _ [] = return ([], False, mass)
483typeConstraintsForBlock _ mass _ [] = return ([], False, mass)
499typeConstraintsForBlock m mass ret (s:ss) = do
484typeConstraintsForBlock m mass ret (s:ss) = do
src/PureScript/Values.hs+2−7
@@ -69,7 +69,7 @@ data Value
69
69
70data Statement
70data Statement
71 = VariableIntroduction Ident Value
71 = VariableIntroduction Ident Value
72− | Assignment AssignmentTarget Value
72+ | Assignment Ident Value
73 | While Value [Statement]
73 | While Value [Statement]
74 | For Ident Value Value [Statement]
74 | For Ident Value Value [Statement]
75 | ForEach Ident Value [Statement]
75 | ForEach Ident Value [Statement]
@@ -91,11 +91,6 @@ data Binder
91 | NullaryBinder String
91 | NullaryBinder String
92 | UnaryBinder String Binder
92 | UnaryBinder String Binder
93 | ObjectBinder [(String, Binder)]
93 | ObjectBinder [(String, Binder)]
94− | ArrayBinder [Binder] (Maybe Binder)
94+ | ArrayBinder [Binder] (Maybe Binder)
95 | NamedBinder Ident Binder
95 | NamedBinder Ident Binder
96 | GuardedBinder Value Binder deriving (Show, Data, Typeable)
96 | GuardedBinder Value Binder deriving (Show, Data, Typeable)
97−
98−data AssignmentTarget
99− = AssignVariable Ident
100− | AssignObjectProperty String AssignmentTarget
101− | AssignArrayIndex Value AssignmentTarget deriving (Show, Data, Typeable)