@@ -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, Data) (types env) }
4545 forM_ dctors $ \(dctor, tys) ->
4646 rethrow (("Error in data constructor " ++ show dctor ++ ":\n") ++) $
4747 addDataConstructor moduleName name args dctor tys
@@ -52,19 +52,19 @@ addDataConstructor moduleName name args dctor tys = do
5252 let retTy = foldl TypeApp (TypeConstructor (Qualified (Just moduleName) name)) (map TypeVar args)
5353 let dctorTy = foldr function retTy tys
5454 let polyType = mkForAll args dctorTy
55− putEnv $ env { dataConstructors = M.insert (Qualified (Just moduleName) dctor) (qualifyAllUnqualifiedNames moduleName env polyType) (dataConstructors env) }
55+ putEnv $ env { dataConstructors = M.insert (Qualified (Just moduleName) dctor) polyType (dataConstructors env) }
5656
5757addTypeSynonym :: ModuleName -> ProperName -> [String] -> Type -> Kind -> Check ()
5858addTypeSynonym moduleName name args ty kind = do
5959 env <- getEnv
60− putEnv $ env { types = M.insert (moduleName, name) (kind, TypeSynonym) (types env)
61− , typeSynonyms = M.insert (moduleName, name) (args, qualifyAllUnqualifiedNames moduleName env ty) (typeSynonyms env) }
60+ putEnv $ env { types = M.insert (Qualified (Just moduleName) name) (kind, TypeSynonym) (types env)
61+ , typeSynonyms = M.insert (Qualified (Just moduleName) name) (args, ty) (typeSynonyms env) }
6262
6363typeIsNotDefined :: ModuleName -> ProperName -> Check ()
6464typeIsNotDefined moduleName name = do
6565 env <- getEnv
6666 guardWith (show name ++ " is already defined") $
67− not $ M.member (moduleName, name) (types env)
67+ not $ M.member (Qualified (Just moduleName) name) (types env)
6868
6969valueIsNotDefined :: ModuleName -> Ident -> Check ()
7070valueIsNotDefined moduleName name = do
@@ -76,7 +76,7 @@ valueIsNotDefined moduleName name = do
7676addValue :: ModuleName -> Ident -> Type -> Check ()
7777addValue moduleName name ty = do
7878 env <- getEnv
79− putEnv (env { names = M.insert (moduleName, name) (qualifyAllUnqualifiedNames moduleName env ty, Value) (names env) })
79+ putEnv (env { names = M.insert (moduleName, name) (ty, Value) (names env) })
8080
8181addTypeClassDictionaries :: [TypeClassDictionaryInScope] -> Check ()
8282addTypeClassDictionaries entries =
@@ -86,7 +86,7 @@ checkTypeClassInstance :: ModuleName -> Type -> Check ()
8686checkTypeClassInstance _ (TypeVar _) = return ()
8787checkTypeClassInstance m (TypeConstructor ctor) = do
8888 env <- getEnv
89− when (canonicalizeType m env ctor `M.member` typeSynonyms env) $ throwError "Type synonym instances are disallowed"
89+ when (ctor `M.member` typeSynonyms env) $ throwError "Type synonym instances are disallowed"
9090 return ()
9191checkTypeClassInstance m (TypeApp ty (TypeVar _)) = checkTypeClassInstance m ty
9292checkTypeClassInstance _ _ = throwError "Type class instance must be of the form T a1 ... an"
@@ -161,8 +161,8 @@ typeCheckAll mainModuleName moduleName (BindingGroupDeclaration vals : rest) = d
161161 return $ d : ds
162162typeCheckAll mainModuleName moduleName (d@(ExternDataDeclaration name kind) : rest) = do
163163 env <- getEnv
164− guardWith (show name ++ " is already defined") $ not $ M.member (moduleName, name) (types env)
165− putEnv $ env { types = M.insert (moduleName, name) (kind, TypeSynonym) (types env) }
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) }
166166 ds <- typeCheckAll mainModuleName moduleName rest
167167 return $ d : ds
168168typeCheckAll mainModuleName moduleName (d@(ExternDeclaration importTy name _ ty) : rest) = do
@@ -172,7 +172,7 @@ typeCheckAll mainModuleName moduleName (d@(ExternDeclaration importTy name _ ty)
172172 guardWith "Expected kind *" $ kind == Star
173173 case M.lookup (moduleName, name) (names env) of
174174 Just _ -> throwError $ show name ++ " is already defined"
175− Nothing -> putEnv (env { names = M.insert (moduleName, name) (qualifyAllUnqualifiedNames moduleName env ty, Extern importTy) (names env) })
175+ Nothing -> putEnv (env { names = M.insert (moduleName, name) (ty, Extern importTy) (names env) })
176176 ds <- typeCheckAll mainModuleName moduleName rest
177177 return $ d : ds
178178typeCheckAll mainModuleName moduleName (d@(FixityDeclaration _ name) : rest) = do
@@ -187,7 +187,7 @@ typeCheckAll mainModuleName currentModule (d@(ImportDeclaration moduleName ident
187187 case idents of
188188 Nothing -> do
189189 shadowIdents (map snd $ filterModule (names env)) env
190− shadowTypes (map snd $ filterModule (types env)) env
190+ shadowTypes (map (\(Qualified _ name) -> name) $ filterModuleQ (types env)) env
191191 Just idents' -> do
192192 shadowIdents (lefts idents') env
193193 shadowTypes (rights idents') env
@@ -197,7 +197,8 @@ typeCheckAll mainModuleName currentModule (d@(ImportDeclaration moduleName ident
197197 where
198198 errorMessage = (("Error in import declaration " ++ show moduleName ++ ":\n") ++)
199199 filterModule = filter ((== moduleName) . fst) . M.keys
200− moduleExists env = not (null (filterModule (names env))) || not (null (filterModule (types env)))
200+ filterModuleQ = filter (\(Qualified (Just mn) _) -> mn == moduleName) . M.keys
201+ moduleExists env = not (null (filterModule (names env))) || not (null (filterModuleQ (types env)))
201202 shadowIdents idents' env =
202203 forM_ idents' $ \ident ->
203204 case (moduleName, ident) `M.lookup` names env of
@@ -208,12 +209,12 @@ typeCheckAll mainModuleName currentModule (d@(ImportDeclaration moduleName ident
208209 Nothing -> throwError (show moduleName ++ "." ++ show ident ++ " is undefined")
209210 shadowTypes pns env =
210211 forM_ pns $ \pn ->
211− case (moduleName, pn) `M.lookup` types env of
212+ case (Qualified (Just moduleName) pn) `M.lookup` types env of
212213 Nothing -> throwError (show moduleName ++ "." ++ show pn ++ " is undefined")
213214 Just (_, DataAlias _ _) -> return ()
214215 Just (k, _) -> do
215− guardWith (show currentModule ++ "." ++ show pn ++ " is already defined") $ (currentModule, pn) `M.notMember` types env
216− modifyEnv (\e -> e { types = M.insert (currentModule, pn) (k, DataAlias moduleName pn) (types e) })
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) })
217218 let keys = map fst . filter (\(_, fn) -> fn `constructs` pn) . M.toList . dataConstructors $ env
218219 forM_ keys $ \dctor ->
219220 case dctor `M.lookup` dataConstructors env of
@@ -237,13 +238,12 @@ typeCheckAll mainModuleName currentModule (d@(ImportDeclaration moduleName ident
237238typeCheckAll mainModuleName moduleName (d@TypeClassDeclaration{} : rest) = do
238239 env <- getEnv
239240 ds <- typeCheckAll mainModuleName moduleName rest
240− return $ qualifyAllUnqualifiedNames moduleName env d : ds
241+ return $ d : ds
241242typeCheckAll mainModuleName moduleName (d@(TypeInstanceDeclaration deps className tys _) : rest) = do
242243 env <- getEnv
243244 dictName <- Check . lift $ mkDictionaryValueName moduleName className tys
244245 mapM_ (checkTypeClassInstance moduleName) tys
245246 forM_ deps $ mapM_ (checkTypeClassInstance moduleName) . snd
246− addTypeClassDictionaries (qualifyAllUnqualifiedNames moduleName env
247− [TypeClassDictionaryInScope (Qualified (Just moduleName) dictName) className tys (Just deps) TCDRegular])
247+ addTypeClassDictionaries [TypeClassDictionaryInScope (Qualified (Just moduleName) dictName) className tys (Just deps) TCDRegular]
248248 ds <- typeCheckAll mainModuleName moduleName rest
249− return $ qualifyAllUnqualifiedNames moduleName env d : ds
249+ return $ d : ds