@@ -41,7 +41,7 @@ import Language.PureScript.Sugar.TypeClasses
4141addDataType :: ModuleName -> ProperName -> [String] -> [(ProperName, [Type])] -> Kind -> Check ()
4242addDataType moduleName name args dctors ctorKind = do
4343 env <- getEnv
44− putEnv $ env { types = M.insert (moduleName, name) (ctorKind, Data) (types env) }
44+ putEnv $ env { types = M.insert (Qualified (Just moduleName) name) ctorKind (types env) }
4545 forM_ dctors $ \(dctor, tys) ->
4646 rethrow (("Error in data constructor " ++ show dctor ++ ":\n") ++) $
4747 addDataConstructor moduleName name args dctor tys
@@ -49,29 +49,16 @@ addDataType moduleName name args dctors ctorKind = do
4949addDataConstructor :: ModuleName -> ProperName -> [String] -> ProperName -> [Type] -> Check ()
5050addDataConstructor moduleName name args dctor tys = do
5151 env <- getEnv
52− dataConstructorIsNotDefined moduleName dctor
5352 let retTy = foldl TypeApp (TypeConstructor (Qualified (Just moduleName) name)) (map TypeVar args)
5453 let dctorTy = foldr function retTy tys
5554 let polyType = mkForAll args dctorTy
56− putEnv $ env { dataConstructors = M.insert (moduleName, dctor) (qualifyAllUnqualifiedNames moduleName env polyType, DataConstructor) (dataConstructors env) }
55+ putEnv $ env { dataConstructors = M.insert (Qualified (Just moduleName) dctor) polyType (dataConstructors env) }
5756
5857addTypeSynonym :: ModuleName -> ProperName -> [String] -> Type -> Kind -> Check ()
5958addTypeSynonym moduleName name args ty kind = do
6059 env <- getEnv
61− putEnv $ env { types = M.insert (moduleName, name) (kind, TypeSynonym) (types env)
62− , typeSynonyms = M.insert (moduleName, name) (args, qualifyAllUnqualifiedNames moduleName env ty) (typeSynonyms env) }
63−
64−typeIsNotDefined :: ModuleName -> ProperName -> Check ()
65−typeIsNotDefined moduleName name = do
66− env <- getEnv
67− guardWith (show name ++ " is already defined") $
68− not $ M.member (moduleName, name) (types env)
69−
70−dataConstructorIsNotDefined :: ModuleName -> ProperName -> Check ()
71−dataConstructorIsNotDefined moduleName dctor = do
72− env <- getEnv
73− guardWith (show dctor ++ " is already defined") $
74− not $ M.member (moduleName, dctor) (dataConstructors 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) }
7562
7663valueIsNotDefined :: ModuleName -> Ident -> Check ()
7764valueIsNotDefined moduleName name = do
@@ -83,7 +70,7 @@ valueIsNotDefined moduleName name = do
8370addValue :: ModuleName -> Ident -> Type -> Check ()
8471addValue moduleName name ty = do
8572 env <- getEnv
86− putEnv (env { names = M.insert (moduleName, name) (qualifyAllUnqualifiedNames moduleName env ty, Value) (names env) })
73+ putEnv (env { names = M.insert (moduleName, name) (ty, Value) (names env) })
8774
8875addTypeClassDictionaries :: [TypeClassDictionaryInScope] -> Check ()
8976addTypeClassDictionaries entries =
@@ -93,7 +80,7 @@ checkTypeClassInstance :: ModuleName -> Type -> Check ()
9380checkTypeClassInstance _ (TypeVar _) = return ()
9481checkTypeClassInstance m (TypeConstructor ctor) = do
9582 env <- getEnv
96− when (canonicalizeType m env ctor `M.member` typeSynonyms env) $ throwError "Type synonym instances are disallowed"
83+ when (ctor `M.member` typeSynonyms env) $ throwError "Type synonym instances are disallowed"
9784 return ()
9885checkTypeClassInstance m (TypeApp ty (TypeVar _)) = checkTypeClassInstance m ty
9986checkTypeClassInstance _ _ = throwError "Type class instance must be of the form T a1 ... an"
@@ -115,7 +102,6 @@ typeCheckAll :: Maybe ModuleName -> ModuleName -> [Declaration] -> Check [Declar
115102typeCheckAll _ _ [] = return []
116103typeCheckAll mainModuleName moduleName (d@(DataDeclaration name args dctors) : rest) = do
117104 rethrow (("Error in type constructor " ++ show name ++ ":\n") ++) $ do
118− typeIsNotDefined moduleName name
119105 ctorKind <- kindsOf moduleName name args (concatMap snd dctors)
120106 addDataType moduleName name args dctors ctorKind
121107 ds <- typeCheckAll mainModuleName moduleName rest
@@ -125,11 +111,9 @@ typeCheckAll mainModuleName moduleName (d@(DataBindingGroupDeclaration tys) : re
125111 let syns = mapMaybe toTypeSynonym tys
126112 let dataDecls = mapMaybe toDataDecl tys
127113 (syn_ks, data_ks) <- kindsOfAll moduleName syns (map (\(name, args, dctors) -> (name, args, concatMap snd dctors)) dataDecls)
128− forM_ (zip dataDecls data_ks) $ \((name, args, dctors), ctorKind) -> do
129− typeIsNotDefined moduleName name
114+ forM_ (zip dataDecls data_ks) $ \((name, args, dctors), ctorKind) ->
130115 addDataType moduleName name args dctors ctorKind
131− forM_ (zip syns syn_ks) $ \((name, args, ty), kind) -> do
132− typeIsNotDefined moduleName name
116+ forM_ (zip syns syn_ks) $ \((name, args, ty), kind) ->
133117 addTypeSynonym moduleName name args ty kind
134118 ds <- typeCheckAll mainModuleName moduleName rest
135119 return $ d : ds
@@ -140,7 +124,6 @@ typeCheckAll mainModuleName moduleName (d@(DataBindingGroupDeclaration tys) : re
140124 toDataDecl _ = Nothing
141125typeCheckAll mainModuleName moduleName (d@(TypeSynonymDeclaration name args ty) : rest) = do
142126 rethrow (("Error in type synonym " ++ show name ++ ":\n") ++) $ do
143− typeIsNotDefined moduleName name
144127 kind <- kindsOf moduleName name args [ty]
145128 addTypeSynonym moduleName name args ty kind
146129 ds <- typeCheckAll mainModuleName moduleName rest
@@ -168,8 +151,7 @@ typeCheckAll mainModuleName moduleName (BindingGroupDeclaration vals : rest) = d
168151 return $ d : ds
169152typeCheckAll mainModuleName moduleName (d@(ExternDataDeclaration name kind) : rest) = do
170153 env <- getEnv
171− guardWith (show name ++ " is already defined") $ not $ M.member (moduleName, name) (types env)
172− putEnv $ env { types = M.insert (moduleName, name) (kind, TypeSynonym) (types env) }
154+ putEnv $ env { types = M.insert (Qualified (Just moduleName) name) kind (types env) }
173155 ds <- typeCheckAll mainModuleName moduleName rest
174156 return $ d : ds
175157typeCheckAll mainModuleName moduleName (d@(ExternDeclaration importTy name _ ty) : rest) = do
@@ -179,7 +161,7 @@ typeCheckAll mainModuleName moduleName (d@(ExternDeclaration importTy name _ ty)
179161 guardWith "Expected kind *" $ kind == Star
180162 case M.lookup (moduleName, name) (names env) of
181163 Just _ -> throwError $ show name ++ " is already defined"
182− Nothing -> putEnv (env { names = M.insert (moduleName, name) (qualifyAllUnqualifiedNames moduleName env ty, Extern importTy) (names env) })
164+ Nothing -> putEnv (env { names = M.insert (moduleName, name) (ty, Extern importTy) (names env) })
183165 ds <- typeCheckAll mainModuleName moduleName rest
184166 return $ d : ds
185167typeCheckAll mainModuleName moduleName (d@(FixityDeclaration _ name) : rest) = do
@@ -194,17 +176,18 @@ typeCheckAll mainModuleName currentModule (d@(ImportDeclaration moduleName ident
194176 case idents of
195177 Nothing -> do
196178 shadowIdents (map snd $ filterModule (names env)) env
197− shadowTypes (map snd $ filterModule (types env)) env
179+ shadowTypes (map (\(Qualified _ name) -> name) $ filterModuleQ (types env)) env
198180 Just idents' -> do
199− shadowIdents (lefts idents') env
200− shadowTypes (rights idents') env
181+ shadowIdents (nameImports idents') env
182+ shadowTypes (typeImports idents') env
201183 shadowTypeClassInstances env
202184 ds <- typeCheckAll mainModuleName currentModule rest
203185 return $ d : ds
204186 where
205187 errorMessage = (("Error in import declaration " ++ show moduleName ++ ":\n") ++)
206188 filterModule = filter ((== moduleName) . fst) . M.keys
207− moduleExists env = not (null (filterModule (names env))) || not (null (filterModule (types env)))
189+ filterModuleQ = filter (\(Qualified (Just mn) _) -> mn == moduleName) . M.keys
190+ moduleExists env = not (null (filterModule (names env))) || not (null (filterModuleQ (types env)))
208191 shadowIdents idents' env =
209192 forM_ idents' $ \ident ->
210193 case (moduleName, ident) `M.lookup` names env of
@@ -215,19 +198,15 @@ typeCheckAll mainModuleName currentModule (d@(ImportDeclaration moduleName ident
215198 Nothing -> throwError (show moduleName ++ "." ++ show ident ++ " is undefined")
216199 shadowTypes pns env =
217200 forM_ pns $ \pn ->
218− case (moduleName, pn) `M.lookup` types env of
201+ case Qualified (Just moduleName) pn `M.lookup` types env of
219202 Nothing -> throwError (show moduleName ++ "." ++ show pn ++ " is undefined")
220− Just (_, DataAlias _ _) -> return ()
221− Just (k, _) -> do
222− guardWith (show currentModule ++ "." ++ show pn ++ " is already defined") $ (currentModule, pn) `M.notMember` types env
223− modifyEnv (\e -> e { types = M.insert (currentModule, pn) (k, DataAlias moduleName pn) (types e) })
224− let keys = map (snd . fst) . filter (\(_, (fn, _)) -> fn `constructs` pn) . M.toList . dataConstructors $ env
203+ Just k -> do
204+ modifyEnv (\e -> e { types = M.insert (Qualified (Just currentModule) pn) k (types e) })
205+ let keys = map fst . filter (\(_, fn) -> fn `constructs` pn) . M.toList . dataConstructors $ env
225206 forM_ keys $ \dctor ->
226− case (moduleName, dctor) `M.lookup` dataConstructors env of
227− Just (_, Alias _ _) -> return ()
228− Just (ctorTy, _) -> do
229− guardWith (show currentModule ++ "." ++ show dctor ++ " is already defined") $ (currentModule, dctor) `M.notMember` dataConstructors env
230− modifyEnv (\e -> e { dataConstructors = M.insert (currentModule, dctor) (ctorTy, Alias moduleName (Ident (runProperName dctor))) (dataConstructors e) })
207+ case dctor `M.lookup` dataConstructors env of
208+ Just ctorTy ->
209+ modifyEnv (\e -> e { dataConstructors = M.insert dctor ctorTy (dataConstructors e) })
231210 Nothing -> throwError (show moduleName ++ "." ++ show dctor ++ " is undefined")
232211 shadowTypeClassInstances env = do
233212 let instances = filter (\tcd ->
@@ -246,13 +225,12 @@ typeCheckAll mainModuleName currentModule (d@(ImportDeclaration moduleName ident
246225typeCheckAll mainModuleName moduleName (d@TypeClassDeclaration{} : rest) = do
247226 env <- getEnv
248227 ds <- typeCheckAll mainModuleName moduleName rest
249− return $ qualifyAllUnqualifiedNames moduleName env d : ds
228+ return $ d : ds
250229typeCheckAll mainModuleName moduleName (d@(TypeInstanceDeclaration deps className tys _) : rest) = do
251230 env <- getEnv
252231 dictName <- Check . lift $ mkDictionaryValueName moduleName className tys
253232 mapM_ (checkTypeClassInstance moduleName) tys
254233 forM_ deps $ mapM_ (checkTypeClassInstance moduleName) . snd
255− addTypeClassDictionaries (qualifyAllUnqualifiedNames moduleName env
256− [TypeClassDictionaryInScope (Qualified (Just moduleName) dictName) className tys (Just deps) TCDRegular])
234+ addTypeClassDictionaries [TypeClassDictionaryInScope (Qualified (Just moduleName) dictName) className tys (Just deps) TCDRegular]
257235 ds <- typeCheckAll mainModuleName moduleName rest
258− return $ qualifyAllUnqualifiedNames moduleName env d : ds
236+ return $ d : ds