@@ -48,12 +48,12 @@ import qualified Data.Map as M
4848data TypeConstraintOrigin
4949 = ValueOrigin Value
5050 | BinderOrigin Binder
51− | AssignmentTargetOrigin AssignmentTarget deriving (Show, D.Data, D.Typeable)
51+ | AssignmentTargetOrigin Ident deriving (Show, D.Data, D.Typeable)
5252
5353prettyPrintOrigin :: TypeConstraintOrigin -> String
5454prettyPrintOrigin (ValueOrigin val) = prettyPrintValue val
5555prettyPrintOrigin (BinderOrigin binder) = prettyPrintBinder binder
56−prettyPrintOrigin (AssignmentTargetOrigin assign) = prettyPrintAssignmentTarget assign
56+prettyPrintOrigin (AssignmentTargetOrigin ident) = show ident
5757
5858data TypeConstraint
5959 = TypeConstraint Int Type TypeConstraintOrigin
@@ -428,10 +428,12 @@ typeConstraintsForStatement m mass ret (VariableIntroduction name val) = do
428428 assignVariable name (m `M.union` mass)
429429 (cs1, n1) <- typeConstraints m val
430430 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
432432 (cs1, n1) <- typeConstraints m val
433− cs2 <- typeConstraintsForAssignmentTarget m mass n1 tgt
434− return (cs1 ++ cs2, False, mass)
433+ case M.lookup ident mass of
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)
435437typeConstraintsForStatement m mass ret (While val inner) = do
436438 (cs1, n1) <- typeConstraints m val
437439 (cs2, allCodePathsReturn, _) <- typeConstraintsForBlock m mass ret inner
@@ -477,23 +479,6 @@ typeConstraintsForElseStatement m mass ret (ElseIf ifst) = do
477479 (cs, allCodePathsReturn) <- typeConstraintsForIfStatement m mass ret ifst
478480 return (cs, allCodePathsReturn)
479481
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−
497482typeConstraintsForBlock :: M.Map Ident Int -> M.Map Ident Int -> Int -> [Statement] -> Check ([TypeConstraint], Bool, M.Map Ident Int)
498483typeConstraintsForBlock _ mass _ [] = return ([], False, mass)
499484typeConstraintsForBlock m mass ret (s:ss) = do