@@ -35,53 +35,90 @@ import Language.PureScript.Names
3535import Language.PureScript.Kinds
3636import Language.PureScript.Declarations
3737
38+addDataType :: ModuleName -> ProperName -> [String] -> [(ProperName, Maybe Type)] -> Kind -> Check ()
39+addDataType moduleName name args dctors ctorKind = do
40+ env <- getEnv
41+ putEnv $ env { types = M.insert (moduleName, name) (ctorKind, Data) (types env) }
42+ forM_ dctors $ \(dctor, maybeTy) ->
43+ rethrow (("Error in data constructor " ++ show name ++ ":\n") ++) $
44+ addDataConstructor moduleName name args dctor maybeTy
45+
46+addDataConstructor :: ModuleName -> ProperName -> [String] -> ProperName -> Maybe Type -> Check ()
47+addDataConstructor moduleName name args dctor maybeTy = do
48+ env <- getEnv
49+ dataConstructorIsNotDefined moduleName dctor
50+ let retTy = foldl TypeApp (TypeConstructor (Qualified (Just moduleName) name)) (map TypeVar args)
51+ let dctorTy = maybe retTy (\ty -> Function [ty] retTy) maybeTy
52+ let polyType = mkForAll args dctorTy
53+ putEnv $ env { dataConstructors = M.insert (moduleName, dctor) polyType (dataConstructors env) }
54+
55+addTypeSynonym :: ModuleName -> ProperName -> [String] -> Type -> Kind -> Check ()
56+addTypeSynonym moduleName name args ty kind = do
57+ env <- getEnv
58+ putEnv $ env { types = M.insert (moduleName, name) (kind, TypeSynonym) (types env)
59+ , typeSynonyms = M.insert (moduleName, name) (args, ty) (typeSynonyms env) }
60+
61+typeIsNotDefined :: ModuleName -> ProperName -> Check ()
62+typeIsNotDefined moduleName name = do
63+ env <- getEnv
64+ guardWith (show name ++ " is already defined") $
65+ not $ M.member (moduleName, name) (types env)
66+
67+dataConstructorIsNotDefined :: ModuleName -> ProperName -> Check ()
68+dataConstructorIsNotDefined moduleName dctor = do
69+ env <- getEnv
70+ guardWith (show dctor ++ " is already defined") $
71+ not $ M.member (moduleName, dctor) (dataConstructors env)
72+
73+valueIsNotDefined :: ModuleName -> Ident -> Check ()
74+valueIsNotDefined moduleName name = do
75+ env <- getEnv
76+ case M.lookup (moduleName, name) (names env) of
77+ Just _ -> throwError $ show name ++ " is already defined"
78+ Nothing -> return ()
79+
80+addValue :: ModuleName -> Ident -> Type -> Check ()
81+addValue moduleName name ty = do
82+ env <- getEnv
83+ putEnv (env { names = M.insert (moduleName, name) (ty, Value) (names env) })
84+
3885typeCheckAll :: ModuleName -> [Declaration] -> Check ()
3986typeCheckAll _ [] = return ()
4087typeCheckAll moduleName (DataDeclaration name args dctors : rest) = do
4188 rethrow (("Error in type constructor " ++ show name ++ ":\n") ++) $ do
42− env <- getEnv
43− guardWith (show name ++ " is already defined") $ not $ M.member (moduleName, name) (types env)
44− ctorKind <- kindsOf moduleName (Just name) args (mapMaybe snd dctors)
45− putEnv $ env { types = M.insert (moduleName, name) (ctorKind, Data) (types env) }
46− forM_ dctors $ \(dctor, maybeTy) ->
47− rethrow (("Error in data constructor " ++ show name ++ ":\n") ++) $ do
48− env' <- getEnv
49− guardWith (show dctor ++ " is already defined") $ not $ M.member (moduleName, dctor) (dataConstructors env')
50− let retTy = foldl TypeApp (TypeConstructor (Qualified (Just moduleName) name)) (map TypeVar args)
51− let dctorTy = maybe retTy (\ty -> Function [ty] retTy) maybeTy
52− let polyType = mkForAll args dctorTy
53− putEnv $ env' { dataConstructors = M.insert (moduleName, dctor) polyType (dataConstructors env') }
89+ typeIsNotDefined moduleName name
90+ ctorKind <- kindsOf moduleName name args (mapMaybe snd dctors)
91+ addDataType moduleName name args dctors ctorKind
92+ typeCheckAll moduleName rest
93+typeCheckAll moduleName (DataBindingGroupDeclaration tys : rest) = do
94+ rethrow (("Error in data binding group " ++ show (map (\(name, _, _) -> name) tys) ++ ":\n") ++) $ do
95+ forM_ tys $ \(name, _, _) ->
96+ typeIsNotDefined moduleName name
97+ ks <- kindsOfAll moduleName (map (\(name, args, dctors) -> (name, args, mapMaybe snd dctors)) tys)
98+ forM (zip tys ks) $ \((name, args, dctors), ctorKind) ->
99+ addDataType moduleName name args dctors ctorKind
54100 typeCheckAll moduleName rest
55−typeCheckAll moduleName (DataBindingGroupDeclaration tys : rest) = error (show tys)
56101typeCheckAll moduleName (TypeSynonymDeclaration name args ty : rest) = do
57102 rethrow (("Error in type synonym " ++ show name ++ ":\n") ++) $ do
58− env <- getEnv
59− guardWith (show name ++ " is already defined") $ not $ M.member (moduleName, name) (types env)
60− kind <- kindsOf moduleName (Just name) args [ty]
61− putEnv $ env { types = M.insert (moduleName, name) (kind, TypeSynonym) (types env)
62− , typeSynonyms = M.insert (moduleName, name) (args, ty) (typeSynonyms env) }
103+ typeIsNotDefined moduleName name
104+ kind <- kindsOf moduleName name args [ty]
105+ addTypeSynonym moduleName name args ty kind
63106 typeCheckAll moduleName rest
64107typeCheckAll _ (TypeDeclaration _ _ : _) = error "Type declarations should have been removed"
65108typeCheckAll moduleName (ValueDeclaration name [] Nothing val : rest) = do
66109 rethrow (("Error in declaration " ++ show name ++ ":\n") ++) $ do
67− env <- getEnv
68− case M.lookup (moduleName, name) (names env) of
69− Just _ -> throwError $ show name ++ " is already defined"
70− Nothing -> do
71− [ty] <- typesOf moduleName [(name, val)]
72− putEnv (env { names = M.insert (moduleName, name) (ty, Value) (names env) })
110+ valueIsNotDefined moduleName name
111+ [ty] <- typesOf moduleName [(name, val)]
112+ addValue moduleName name ty
73113 typeCheckAll moduleName rest
74114typeCheckAll _ (ValueDeclaration _ _ _ _ : _) = error "Binders were not desugared"
75115typeCheckAll moduleName (BindingGroupDeclaration vals : rest) = do
76116 rethrow (("Error in binding group " ++ show (map fst vals) ++ ":\n") ++) $ do
77− forM_ (map fst vals) $ \name -> do
78− env <- getEnv
79− case M.lookup (moduleName, name) (names env) of
80− Just _ -> throwError $ show name ++ " is already defined"
81− Nothing -> return ()
117+ forM_ (map fst vals) $ \name ->
118+ valueIsNotDefined moduleName name
82119 tys <- typesOf moduleName vals
83120 forM (zip (map fst vals) tys) $ \(name, ty) ->
84− modifyEnv $ \env -> env { names = M.insert (moduleName, name) (ty, Value) (names env) }
121+ addValue moduleName name ty
85122 typeCheckAll moduleName rest
86123typeCheckAll moduleName (ExternDataDeclaration name kind : rest) = do
87124 env <- getEnv
@@ -124,22 +161,22 @@ typeCheckAll currentModule (ImportDeclaration moduleName idents : rest) = do
124161 guardWith ("Module " ++ show moduleName ++ " does not exist") $ moduleExists env
125162 case idents of
126163 Nothing -> do
127− bindIdents (map snd $ filterModule (names env)) env
128− bindTypes (map snd $ filterModule (types env)) env
164+ shadowIdents (map snd $ filterModule (names env)) env
165+ shadowTypes (map snd $ filterModule (types env)) env
129166 Just idents' -> do
130− bindIdents (lefts idents') env
131− bindTypes (rights idents') env
167+ shadowIdents (lefts idents') env
168+ shadowTypes (rights idents') env
132169 typeCheckAll currentModule rest
133170 where errorMessage = (("Error in import declaration " ++ show moduleName ++ ":\n") ++)
134171 filterModule = filter ((== moduleName) . fst) . M.keys
135172 moduleExists env = not (null (filterModule (names env))) || not (null (filterModule (types env)))
136− bindIdents idents' env =
173+ shadowIdents idents' env =
137174 forM_ idents' $ \ident -> do
138175 guardWith (show currentModule ++ "." ++ show ident ++ " is already defined") $ (currentModule, ident) `M.notMember` names env
139176 case (moduleName, ident) `M.lookup` names env of
140177 Just (pt, _) -> modifyEnv (\e -> e { names = M.insert (currentModule, ident) (pt, Alias moduleName ident) (names e) })
141178 Nothing -> throwError (show moduleName ++ "." ++ show ident ++ " is undefined")
142− bindTypes pns env =
179+ shadowTypes pns env =
143180 forM_ pns $ \pn -> do
144181 guardWith (show currentModule ++ "." ++ show pn ++ " is already defined") $ (currentModule, pn) `M.notMember` types env
145182 case (moduleName, pn) `M.lookup` types env of