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