@@ -18,7 +18,6 @@ module PureScript.TypeChecker (
18 module PureScript.TypeChecker.Monad,
18 module PureScript.TypeChecker.Monad,
19 module PureScript.TypeChecker.Kinds,
19 module PureScript.TypeChecker.Kinds,
20 module PureScript.TypeChecker.Types,
20 module PureScript.TypeChecker.Types,
22 typeCheckAll,
21 typeCheckAll,
@@ -40,30 +39,42 @@ import Control.Monad.Error
41import qualified Data.Map as M
40import qualified Data.Map as M
43−typeCheck :: Declaration -> Check ()
42+typeCheckAll :: [Declaration] -> Check ()
43+typeCheckAll [] = return ()
44−typeCheck (DataDeclaration dcs@(DataConstructors
44+typeCheckAll (DataDeclaration dcs@(DataConstructors
45 { typeConstructorName = name
45 { typeConstructorName = name
46 , typeArguments = args
46 , typeArguments = args
47 , dataConstructors = ctors
47 , dataConstructors = ctors
48− })) = rethrow (("Error in type constructor " ++ name ++ ": ") ++) $ do
49+ rethrow (("Error in type constructor " ++ name ++ ": ") ++) $ do
49− env <- getEnv
50+ env <- getEnv
50− guardWith (name ++ " is already defined") $ not $ M.member name (types env)
51+ guardWith (name ++ " is already defined") $ not $ M.member name (types env)
51− ctorKind <- kindsOf name args (catMaybes $ map snd ctors)
52+ ctorKind <- kindsOf name args (catMaybes $ map snd ctors)
52− putEnv $ env { types = M.insert name ctorKind (types env) }
53+ putEnv $ env { types = M.insert name ctorKind (types env) }
53− flip mapM_ ctors $ \(dctor, maybeTy) ->
54+ flip mapM_ ctors $ \(dctor, maybeTy) ->
54− rethrow (("Error in data constructor " ++ name ++ ": ") ++) $ do
55+ rethrow (("Error in data constructor " ++ name ++ ": ") ++) $ do
55− env' <- getEnv
56+ env' <- getEnv
56− guardWith (dctor ++ " is already defined") $ not $ flip M.member (names env') dctor
57+ guardWith (dctor ++ " is already defined") $ not $ flip M.member (names env') dctor
57− let retTy = foldl TypeApp (TypeConstructor name) (map TypeVar args)
58+ let retTy = foldl TypeApp (TypeConstructor name) (map TypeVar args)
58− let dctorTy = maybe retTy (\ty -> Function [ty] retTy) maybeTy
59+ let dctorTy = maybe retTy (\ty -> Function [ty] retTy) maybeTy
59− putEnv $ env' { names = M.insert dctor dctorTy (names env') }
60+ putEnv $ env' { names = M.insert dctor dctorTy (names env') }
62+typeCheckAll (TypeDeclaration name ty : ValueDeclaration name' val : rest) | name == name' =
63+ typeCheckAll (ValueDeclaration name (TypedValue val ty) : rest)
64+typeCheckAll (TypeDeclaration name _ : _) = throwError $ "Orphan type declaration for " ++ name
65+typeCheckAll (ValueDeclaration name val : rest) = do
60−typeCheck (ValueDeclaration name val) = rethrow (("Error in declaration " ++ name ++ ": ") ++) $ do
66+ rethrow (("Error in declaration " ++ name ++ ": ") ++) $ do
61− env <- getEnv
67+ env <- getEnv
62− case M.lookup name (names env) of
68+ case M.lookup name (names env) of
63− Just ty -> throwError $ name ++ " is already defined"
69+ Just ty -> throwError $ name ++ " is already defined"
64− Nothing -> do
70+ Nothing -> do
65− ty <- typeOf name val
71+ ty <- typeOf name val
66− putEnv (env { names = M.insert name ty (names env) })
72+ putEnv (env { names = M.insert name ty (names env) })
68−typeCheckAll :: [Declaration] -> Check ()
74+typeCheckAll (ExternDeclaration name ty : rest) = do
69−typeCheckAll = mapM_ typeCheck
75+ rethrow (("Error in extern declaration " ++ name ++ ": ") ++) $ do
77+ case M.lookup name (names env) of
78+ Just _ -> throwError $ name ++ " is already defined"
79+ Nothing -> putEnv (env { names = M.insert name ty (names env) })