@@ -41,7 +41,7 @@ import Language.PureScript.Sugar.TypeClasses
41addDataType :: ModuleName -> ProperName -> [String] -> [(ProperName, [Type])] -> Kind -> Check ()
41addDataType :: ModuleName -> ProperName -> [String] -> [(ProperName, [Type])] -> Kind -> Check ()
42addDataType moduleName name args dctors ctorKind = do
42addDataType moduleName name args dctors ctorKind = do
43 env <- getEnv
43 env <- getEnv
44− putEnv $ env { types = M.insert (Qualified (Just moduleName) name) (ctorKind, Data) (types env) }
44+ putEnv $ env { types = M.insert (Qualified (Just moduleName) name) ctorKind (types env) }
45 forM_ dctors $ \(dctor, tys) ->
45 forM_ dctors $ \(dctor, tys) ->
46 rethrow (("Error in data constructor " ++ show dctor ++ ":\n") ++) $
46 rethrow (("Error in data constructor " ++ show dctor ++ ":\n") ++) $
47 addDataConstructor moduleName name args dctor tys
47 addDataConstructor moduleName name args dctor tys
@@ -57,15 +57,9 @@ addDataConstructor moduleName name args dctor tys = do
57addTypeSynonym :: ModuleName -> ProperName -> [String] -> Type -> Kind -> Check ()
57addTypeSynonym :: ModuleName -> ProperName -> [String] -> Type -> Kind -> Check ()
58addTypeSynonym moduleName name args ty kind = do
58addTypeSynonym moduleName name args ty kind = do
59 env <- getEnv
59 env <- getEnv
60− putEnv $ env { types = M.insert (Qualified (Just moduleName) name) (kind, TypeSynonym) (types env)
60+ putEnv $ env { types = M.insert (Qualified (Just moduleName) name) kind (types env)
61 , typeSynonyms = M.insert (Qualified (Just moduleName) name) (args, ty) (typeSynonyms env) }
61 , typeSynonyms = M.insert (Qualified (Just moduleName) name) (args, ty) (typeSynonyms env) }
63−typeIsNotDefined :: ModuleName -> ProperName -> Check ()
64−typeIsNotDefined moduleName name = do
66− guardWith (show name ++ " is already defined") $
67− not $ M.member (Qualified (Just moduleName) name) (types env)
69valueIsNotDefined :: ModuleName -> Ident -> Check ()
63valueIsNotDefined :: ModuleName -> Ident -> Check ()
70valueIsNotDefined moduleName name = do
64valueIsNotDefined moduleName name = do
71 env <- getEnv
65 env <- getEnv
@@ -108,7 +102,6 @@ typeCheckAll :: Maybe ModuleName -> ModuleName -> [Declaration] -> Check [Declar
108typeCheckAll _ _ [] = return []
102typeCheckAll _ _ [] = return []
109typeCheckAll mainModuleName moduleName (d@(DataDeclaration name args dctors) : rest) = do
103typeCheckAll mainModuleName moduleName (d@(DataDeclaration name args dctors) : rest) = do
110 rethrow (("Error in type constructor " ++ show name ++ ":\n") ++) $ do
104 rethrow (("Error in type constructor " ++ show name ++ ":\n") ++) $ do
111− typeIsNotDefined moduleName name
112 ctorKind <- kindsOf moduleName name args (concatMap snd dctors)
105 ctorKind <- kindsOf moduleName name args (concatMap snd dctors)
113 addDataType moduleName name args dctors ctorKind
106 addDataType moduleName name args dctors ctorKind
114 ds <- typeCheckAll mainModuleName moduleName rest
107 ds <- typeCheckAll mainModuleName moduleName rest
@@ -119,10 +112,8 @@ typeCheckAll mainModuleName moduleName (d@(DataBindingGroupDeclaration tys) : re
119 let dataDecls = mapMaybe toDataDecl tys
112 let dataDecls = mapMaybe toDataDecl tys
120 (syn_ks, data_ks) <- kindsOfAll moduleName syns (map (\(name, args, dctors) -> (name, args, concatMap snd dctors)) dataDecls)
113 (syn_ks, data_ks) <- kindsOfAll moduleName syns (map (\(name, args, dctors) -> (name, args, concatMap snd dctors)) dataDecls)
121 forM_ (zip dataDecls data_ks) $ \((name, args, dctors), ctorKind) -> do
114 forM_ (zip dataDecls data_ks) $ \((name, args, dctors), ctorKind) -> do
122− typeIsNotDefined moduleName name
123 addDataType moduleName name args dctors ctorKind
115 addDataType moduleName name args dctors ctorKind
124 forM_ (zip syns syn_ks) $ \((name, args, ty), kind) -> do
116 forM_ (zip syns syn_ks) $ \((name, args, ty), kind) -> do
125− typeIsNotDefined moduleName name
126 addTypeSynonym moduleName name args ty kind
117 addTypeSynonym moduleName name args ty kind
127 ds <- typeCheckAll mainModuleName moduleName rest
118 ds <- typeCheckAll mainModuleName moduleName rest
128 return $ d : ds
119 return $ d : ds
@@ -133,7 +124,6 @@ typeCheckAll mainModuleName moduleName (d@(DataBindingGroupDeclaration tys) : re
133 toDataDecl _ = Nothing
124 toDataDecl _ = Nothing
134typeCheckAll mainModuleName moduleName (d@(TypeSynonymDeclaration name args ty) : rest) = do
125typeCheckAll mainModuleName moduleName (d@(TypeSynonymDeclaration name args ty) : rest) = do
135 rethrow (("Error in type synonym " ++ show name ++ ":\n") ++) $ do
126 rethrow (("Error in type synonym " ++ show name ++ ":\n") ++) $ do
136− typeIsNotDefined moduleName name
137 kind <- kindsOf moduleName name args [ty]
127 kind <- kindsOf moduleName name args [ty]
138 addTypeSynonym moduleName name args ty kind
128 addTypeSynonym moduleName name args ty kind
139 ds <- typeCheckAll mainModuleName moduleName rest
129 ds <- typeCheckAll mainModuleName moduleName rest
@@ -161,8 +151,7 @@ typeCheckAll mainModuleName moduleName (BindingGroupDeclaration vals : rest) = d
161 return $ d : ds
151 return $ d : ds
162typeCheckAll mainModuleName moduleName (d@(ExternDataDeclaration name kind) : rest) = do
152typeCheckAll mainModuleName moduleName (d@(ExternDataDeclaration name kind) : rest) = do
163 env <- getEnv
153 env <- getEnv
164− guardWith (show name ++ " is already defined") $ not $ M.member (Qualified (Just moduleName) name) (types env)
165− putEnv $ env { types = M.insert (Qualified (Just moduleName) name) (kind, TypeSynonym) (types env) }
154+ putEnv $ env { types = M.insert (Qualified (Just moduleName) name) kind (types env) }
166 ds <- typeCheckAll mainModuleName moduleName rest
155 ds <- typeCheckAll mainModuleName moduleName rest
167 return $ d : ds
156 return $ d : ds
168typeCheckAll mainModuleName moduleName (d@(ExternDeclaration importTy name _ ty) : rest) = do
157typeCheckAll mainModuleName moduleName (d@(ExternDeclaration importTy name _ ty) : rest) = do
@@ -211,10 +200,8 @@ typeCheckAll mainModuleName currentModule (d@(ImportDeclaration moduleName ident
211 forM_ pns $ \pn ->
200 forM_ pns $ \pn ->
212 case Qualified (Just moduleName) pn `M.lookup` types env of
201 case Qualified (Just moduleName) pn `M.lookup` types env of
213 Nothing -> throwError (show moduleName ++ "." ++ show pn ++ " is undefined")
202 Nothing -> throwError (show moduleName ++ "." ++ show pn ++ " is undefined")
214− Just (_, DataAlias _ _) -> return ()
215− Just (k, _) -> do
203+ Just k -> do
216− guardWith (show currentModule ++ "." ++ show pn ++ " is already defined") $ Qualified (Just currentModule) pn `M.notMember` types env
217− modifyEnv (\e -> e { types = M.insert (Qualified (Just currentModule) pn) (k, DataAlias moduleName pn) (types e) })
204+ modifyEnv (\e -> e { types = M.insert (Qualified (Just currentModule) pn) k (types e) })
218 let keys = map fst . filter (\(_, fn) -> fn `constructs` pn) . M.toList . dataConstructors $ env
205 let keys = map fst . filter (\(_, fn) -> fn `constructs` pn) . M.toList . dataConstructors $ env
219 forM_ keys $ \dctor ->
206 forM_ keys $ \dctor ->
220 case dctor `M.lookup` dataConstructors env of
207 case dctor `M.lookup` dataConstructors env of