@@ -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 (moduleName, name) (ctorKind, Data) (types env) }
44+ putEnv $ env { types = M.insert (Qualified (Just moduleName) name) (ctorKind, Data) (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
@@ -52,19 +52,19 @@ addDataConstructor moduleName name args dctor tys = do
52 let retTy = foldl TypeApp (TypeConstructor (Qualified (Just moduleName) name)) (map TypeVar args)
52 let retTy = foldl TypeApp (TypeConstructor (Qualified (Just moduleName) name)) (map TypeVar args)
53 let dctorTy = foldr function retTy tys
53 let dctorTy = foldr function retTy tys
54 let polyType = mkForAll args dctorTy
54 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) }
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 (moduleName, name) (kind, TypeSynonym) (types env)
60+ putEnv $ env { types = M.insert (Qualified (Just moduleName) name) (kind, TypeSynonym) (types env)
61− , typeSynonyms = M.insert (moduleName, name) (args, qualifyAllUnqualifiedNames moduleName env ty) (typeSynonyms env) }
61+ , typeSynonyms = M.insert (Qualified (Just moduleName) name) (args, ty) (typeSynonyms env) }
63typeIsNotDefined :: ModuleName -> ProperName -> Check ()
63typeIsNotDefined :: ModuleName -> ProperName -> Check ()
64typeIsNotDefined moduleName name = do
64typeIsNotDefined moduleName name = do
65 env <- getEnv
65 env <- getEnv
66 guardWith (show name ++ " is already defined") $
66 guardWith (show name ++ " is already defined") $
67− not $ M.member (moduleName, name) (types env)
67+ not $ M.member (Qualified (Just moduleName) name) (types env)
69valueIsNotDefined :: ModuleName -> Ident -> Check ()
69valueIsNotDefined :: ModuleName -> Ident -> Check ()
70valueIsNotDefined moduleName name = do
70valueIsNotDefined moduleName name = do
@@ -76,7 +76,7 @@ valueIsNotDefined moduleName name = do
76addValue :: ModuleName -> Ident -> Type -> Check ()
76addValue :: ModuleName -> Ident -> Type -> Check ()
77addValue moduleName name ty = do
77addValue moduleName name ty = do
78 env <- getEnv
78 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) })
81addTypeClassDictionaries :: [TypeClassDictionaryInScope] -> Check ()
81addTypeClassDictionaries :: [TypeClassDictionaryInScope] -> Check ()
82addTypeClassDictionaries entries =
82addTypeClassDictionaries entries =
@@ -86,7 +86,7 @@ checkTypeClassInstance :: ModuleName -> Type -> Check ()
86checkTypeClassInstance _ (TypeVar _) = return ()
86checkTypeClassInstance _ (TypeVar _) = return ()
87checkTypeClassInstance m (TypeConstructor ctor) = do
87checkTypeClassInstance m (TypeConstructor ctor) = do
88 env <- getEnv
88 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"
91checkTypeClassInstance m (TypeApp ty (TypeVar _)) = checkTypeClassInstance m ty
91checkTypeClassInstance m (TypeApp ty (TypeVar _)) = checkTypeClassInstance m ty
92checkTypeClassInstance _ _ = throwError "Type class instance must be of the form T a1 ... an"
92checkTypeClassInstance _ _ = throwError "Type class instance must be of the form T a1 ... an"
@@ -161,8 +161,8 @@ typeCheckAll mainModuleName moduleName (BindingGroupDeclaration vals : rest) = d
161 return $ d : ds
161 return $ d : ds
162typeCheckAll mainModuleName moduleName (d@(ExternDataDeclaration name kind) : rest) = do
162typeCheckAll mainModuleName moduleName (d@(ExternDataDeclaration name kind) : rest) = do
163 env <- getEnv
163 env <- getEnv
164− guardWith (show name ++ " is already defined") $ not $ M.member (moduleName, name) (types env)
164+ guardWith (show name ++ " is already defined") $ not $ M.member (Qualified (Just moduleName) name) (types env)
165− putEnv $ env { types = M.insert (moduleName, name) (kind, TypeSynonym) (types env) }
165+ putEnv $ env { types = M.insert (Qualified (Just moduleName) name) (kind, TypeSynonym) (types env) }
166 ds <- typeCheckAll mainModuleName moduleName rest
166 ds <- typeCheckAll mainModuleName moduleName rest
167 return $ d : ds
167 return $ d : ds
168typeCheckAll mainModuleName moduleName (d@(ExternDeclaration importTy name _ ty) : rest) = do
168typeCheckAll mainModuleName moduleName (d@(ExternDeclaration importTy name _ ty) : rest) = do
@@ -172,7 +172,7 @@ typeCheckAll mainModuleName moduleName (d@(ExternDeclaration importTy name _ ty)
172 guardWith "Expected kind *" $ kind == Star
172 guardWith "Expected kind *" $ kind == Star
173 case M.lookup (moduleName, name) (names env) of
173 case M.lookup (moduleName, name) (names env) of
174 Just _ -> throwError $ show name ++ " is already defined"
174 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) })
176 ds <- typeCheckAll mainModuleName moduleName rest
176 ds <- typeCheckAll mainModuleName moduleName rest
177 return $ d : ds
177 return $ d : ds
178typeCheckAll mainModuleName moduleName (d@(FixityDeclaration _ name) : rest) = do
178typeCheckAll mainModuleName moduleName (d@(FixityDeclaration _ name) : rest) = do
@@ -187,7 +187,7 @@ typeCheckAll mainModuleName currentModule (d@(ImportDeclaration moduleName ident
187 case idents of
187 case idents of
188 Nothing -> do
188 Nothing -> do
189 shadowIdents (map snd $ filterModule (names env)) env
189 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
191 Just idents' -> do
191 Just idents' -> do
192 shadowIdents (lefts idents') env
192 shadowIdents (lefts idents') env
193 shadowTypes (rights idents') env
193 shadowTypes (rights idents') env
@@ -197,7 +197,8 @@ typeCheckAll mainModuleName currentModule (d@(ImportDeclaration moduleName ident
198 errorMessage = (("Error in import declaration " ++ show moduleName ++ ":\n") ++)
198 errorMessage = (("Error in import declaration " ++ show moduleName ++ ":\n") ++)
199 filterModule = filter ((== moduleName) . fst) . M.keys
199 filterModule = filter ((== moduleName) . fst) . M.keys
200+ filterModuleQ = filter (\(Qualified (Just mn) _) -> mn == moduleName) . M.keys
200− moduleExists env = not (null (filterModule (names env))) || not (null (filterModule (types env)))
201+ moduleExists env = not (null (filterModule (names env))) || not (null (filterModuleQ (types env)))
201 shadowIdents idents' env =
202 shadowIdents idents' env =
202 forM_ idents' $ \ident ->
203 forM_ idents' $ \ident ->
203 case (moduleName, ident) `M.lookup` names env of
204 case (moduleName, ident) `M.lookup` names env of
@@ -208,12 +209,12 @@ typeCheckAll mainModuleName currentModule (d@(ImportDeclaration moduleName ident
208 Nothing -> throwError (show moduleName ++ "." ++ show ident ++ " is undefined")
209 Nothing -> throwError (show moduleName ++ "." ++ show ident ++ " is undefined")
209 shadowTypes pns env =
210 shadowTypes pns env =
210 forM_ pns $ \pn ->
211 forM_ pns $ \pn ->
211− case (moduleName, pn) `M.lookup` types env of
212+ case (Qualified (Just moduleName) pn) `M.lookup` types env of
212 Nothing -> throwError (show moduleName ++ "." ++ show pn ++ " is undefined")
213 Nothing -> throwError (show moduleName ++ "." ++ show pn ++ " is undefined")
213 Just (_, DataAlias _ _) -> return ()
214 Just (_, DataAlias _ _) -> return ()
214 Just (k, _) -> do
215 Just (k, _) -> do
215− guardWith (show currentModule ++ "." ++ show pn ++ " is already defined") $ (currentModule, pn) `M.notMember` types env
216+ guardWith (show currentModule ++ "." ++ show pn ++ " is already defined") $ (Qualified (Just currentModule) pn) `M.notMember` types env
216− modifyEnv (\e -> e { types = M.insert (currentModule, pn) (k, DataAlias moduleName pn) (types e) })
217+ modifyEnv (\e -> e { types = M.insert (Qualified (Just currentModule) pn) (k, DataAlias moduleName pn) (types e) })
217 let keys = map fst . filter (\(_, fn) -> fn `constructs` pn) . M.toList . dataConstructors $ env
218 let keys = map fst . filter (\(_, fn) -> fn `constructs` pn) . M.toList . dataConstructors $ env
218 forM_ keys $ \dctor ->
219 forM_ keys $ \dctor ->
219 case dctor `M.lookup` dataConstructors env of
220 case dctor `M.lookup` dataConstructors env of
@@ -237,13 +238,12 @@ typeCheckAll mainModuleName currentModule (d@(ImportDeclaration moduleName ident
237typeCheckAll mainModuleName moduleName (d@TypeClassDeclaration{} : rest) = do
238typeCheckAll mainModuleName moduleName (d@TypeClassDeclaration{} : rest) = do
238 env <- getEnv
239 env <- getEnv
239 ds <- typeCheckAll mainModuleName moduleName rest
240 ds <- typeCheckAll mainModuleName moduleName rest
240− return $ qualifyAllUnqualifiedNames moduleName env d : ds
241+ return $ d : ds
241typeCheckAll mainModuleName moduleName (d@(TypeInstanceDeclaration deps className tys _) : rest) = do
242typeCheckAll mainModuleName moduleName (d@(TypeInstanceDeclaration deps className tys _) : rest) = do
242 env <- getEnv
243 env <- getEnv
243 dictName <- Check . lift $ mkDictionaryValueName moduleName className tys
244 dictName <- Check . lift $ mkDictionaryValueName moduleName className tys
244 mapM_ (checkTypeClassInstance moduleName) tys
245 mapM_ (checkTypeClassInstance moduleName) tys
245 forM_ deps $ mapM_ (checkTypeClassInstance moduleName) . snd
246 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]
248 ds <- typeCheckAll mainModuleName moduleName rest
248 ds <- typeCheckAll mainModuleName moduleName rest
249− return $ qualifyAllUnqualifiedNames moduleName env d : ds
249+ return $ d : ds