@@ -388,13 +388,6 @@ infer' (ArrayLiteral vals) = do
388388 els <- fresh
389389 forM_ ts $ \(TypedValue _ _ t) -> els ?= TypeApp tyArray t
390390 return $ TypedValue True (ArrayLiteral ts) els
391−infer' (Unary op val) = do
392− v <- infer val
393− inferUnary op v
394−infer' (Binary op left right) = do
395− v1 <- infer left
396− v2 <- infer right
397− inferBinary op v1 v2
398391infer' (ObjectLiteral ps) = do
399392 ensureNoDuplicateProperties ps
400393 ts <- mapM (infer . snd) ps
@@ -409,11 +402,6 @@ infer' (ObjectUpdate o ps) = do
409402 oldTys <- zip (map fst ps) <$> replicateM (length ps) fresh
410403 o' <- check o $ Object $ rowFromList (oldTys, row)
411404 return $ TypedValue True (ObjectUpdate o' newVals) $ Object $ rowFromList (newTys, row)
412−infer' (Indexer index val) = do
413− el <- fresh
414− index' <- check index tyNumber
415− val' <- check val (TypeApp tyArray el)
416− return $ TypedValue True (Indexer (TypedValue True index' tyNumber) (TypedValue True val' (TypeApp tyArray el))) el
417405infer' (Accessor prop val) = do
418406 typed@(TypedValue _ _ objTy) <- infer val
419407 propTy <- inferProperty objTy prop
@@ -492,102 +480,6 @@ inferProperty (ForAll ident ty) prop = do
492480 inferProperty replaced prop
493481inferProperty _ _ = return Nothing
494482
495−-- |
496−-- Infer the type of a unary operator application
497−--
498−inferUnary :: UnaryOperator -> Value -> UnifyT Check Value
499−inferUnary op (TypedValue _ val valTy) =
500− case fromMaybe (error "Invalid operator") $ lookup op unaryOps of
501− (valTy', resTy) -> do
502− valTy' ?= valTy
503− return $ TypedValue True (Unary op val) resTy
504−inferUnary _ _ = error "Invalid arguments to inferUnary"
505−
506−-- |
507−-- Check the type of a unary operator application
508−--
509−checkUnary :: UnaryOperator -> Value -> Type -> UnifyT Check Value
510−checkUnary op val res =
511− case fromMaybe (error "Invalid operator") $ lookup op unaryOps of
512− (valTy, resTy) -> do
513− res ?= resTy
514− val' <- check val valTy
515− return $ Unary op val'
516−
517−-- |
518−-- Built-in unary operators
519−--
520−unaryOps :: [(UnaryOperator, (Type, Type))]
521−unaryOps = [ (Negate, (tyNumber, tyNumber))
522− , (Not, (tyBoolean, tyBoolean))
523− , (BitwiseNot, (tyNumber, tyNumber))
524− ]
525−
526−-- |
527−-- Infer the type of a binary operator application
528−--
529−inferBinary :: BinaryOperator -> Value -> Value -> UnifyT Check Value
530−inferBinary op left@(TypedValue _ _ leftTy) right@(TypedValue _ _ rightTy) | isEqualityTest op = do
531− leftTy ?= rightTy
532− return $ TypedValue True (Binary op left right) tyBoolean
533−inferBinary op left@(TypedValue _ _ leftTy) right@(TypedValue _ _ rightTy) =
534− case fromMaybe (error "Invalid operator") $ lookup op binaryOps of
535− (valTy, resTy) -> do
536− leftTy ?= valTy
537− rightTy ?= valTy
538− return $ TypedValue True (Binary op left right) resTy
539−inferBinary _ _ _ = error "Invalid arguments to inferBinary"
540−
541−-- |
542−-- Check the type of a binary operator application
543−--
544−checkBinary :: BinaryOperator -> Value -> Value -> Type -> UnifyT Check Value
545−checkBinary op left right res | isEqualityTest op = do
546− res ?= tyBoolean
547− left'@(TypedValue _ _ t1) <- infer left
548− right'@(TypedValue _ _ t2) <- infer right
549− t1 ?= t2
550− return $ Binary op left' right'
551−checkBinary op left right res =
552− case fromMaybe (error "Invalid operator") $ lookup op binaryOps of
553− (valTy, resTy) -> do
554− res ?= resTy
555− left' <- check left valTy
556− right' <- check right valTy
557− return $ Binary op left' right'
558−
559−-- |
560−-- Check if a @BinaryOperator@ is an equality test
561−--
562−isEqualityTest :: BinaryOperator -> Bool
563−isEqualityTest EqualTo = True
564−isEqualityTest NotEqualTo = True
565−isEqualityTest _ = False
566−
567−-- |
568−-- Built-in binary operators
569−--
570−binaryOps :: [(BinaryOperator, (Type, Type))]
571−binaryOps = [ (Add, (tyNumber, tyNumber))
572− , (Subtract, (tyNumber, tyNumber))
573− , (Multiply, (tyNumber, tyNumber))
574− , (Divide, (tyNumber, tyNumber))
575− , (Modulus, (tyNumber, tyNumber))
576− , (BitwiseAnd, (tyNumber, tyNumber))
577− , (BitwiseOr, (tyNumber, tyNumber))
578− , (BitwiseXor, (tyNumber, tyNumber))
579− , (ShiftRight, (tyNumber, tyNumber))
580− , (ZeroFillShiftRight, (tyNumber, tyNumber))
581− , (And, (tyBoolean, tyBoolean))
582− , (Or, (tyBoolean, tyBoolean))
583− , (Concat, (tyString, tyString))
584− , (Modulus, (tyNumber, tyNumber))
585− , (LessThan, (tyNumber, tyBoolean))
586− , (LessThanOrEqualTo, (tyNumber, tyBoolean))
587− , (GreaterThan, (tyNumber, tyBoolean))
588− , (GreaterThanOrEqualTo, (tyNumber, tyBoolean))
589− ]
590−
591483-- |
592484-- Infer the types of variables brought into scope by a binder
593485--
@@ -795,13 +687,7 @@ check' val u@(TUnknown _) = do
795687check' v@(NumericLiteral _) t | t == tyNumber = return v
796688check' v@(StringLiteral _) t | t == tyString = return v
797689check' v@(BooleanLiteral _) t | t == tyBoolean = return v
798−check' (Unary op val) ty = checkUnary op val ty
799−check' (Binary op left right) ty = checkBinary op left right ty
800690check' (ArrayLiteral vals) (TypeApp a ty) | a == tyArray = ArrayLiteral <$> forM vals (\val -> check val ty)
801−check' (Indexer index vals) ty = do
802− index' <- check index tyNumber
803− vals' <- check vals (TypeApp tyArray ty)
804− return $ Indexer index' vals'
805691check' (Abs arg ret) (TypeApp (TypeApp t argTy) retTy) | t == tyFunction = do
806692 Just moduleName <- checkCurrentModule <$> get
807693 ret' <- bindLocalVariables moduleName [(arg, argTy)] $ check ret retTy