@@ -24,6 +24,8 @@ import Language.PureScript.TypeChecker.Kinds as T
24import Language.PureScript.TypeChecker.Types as T
24import Language.PureScript.TypeChecker.Types as T
25import Language.PureScript.TypeChecker.Synonyms as T
25import Language.PureScript.TypeChecker.Synonyms as T
28+import Data.Generics (mkT, everywhere)
27import Data.Maybe
29import Data.Maybe
28import qualified Data.Map as M
30import qualified Data.Map as M
29import Control.Monad.State
31import Control.Monad.State
@@ -50,13 +52,13 @@ addDataConstructor moduleName name args dctor maybeTy = do
50 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)
51 let dctorTy = maybe retTy (\ty -> Function [ty] retTy) maybeTy
53 let dctorTy = maybe retTy (\ty -> Function [ty] retTy) maybeTy
52 let polyType = mkForAll args dctorTy
54 let polyType = mkForAll args dctorTy
53− putEnv $ env { dataConstructors = M.insert (moduleName, dctor) (polyType, DataConstructor) (dataConstructors env) }
55+ putEnv $ env { dataConstructors = M.insert (moduleName, dctor) (qualifyAllUnqualifiedNames moduleName env polyType, DataConstructor) (dataConstructors env) }
55addTypeSynonym :: ModuleName -> ProperName -> [String] -> Type -> Kind -> Check ()
57addTypeSynonym :: ModuleName -> ProperName -> [String] -> Type -> Kind -> Check ()
56addTypeSynonym moduleName name args ty kind = do
58addTypeSynonym moduleName name args ty kind = do
57 env <- getEnv
59 env <- getEnv
58 putEnv $ env { types = M.insert (moduleName, name) (kind, TypeSynonym) (types env)
60 putEnv $ env { types = M.insert (moduleName, name) (kind, TypeSynonym) (types env)
59− , typeSynonyms = M.insert (moduleName, name) (args, ty) (typeSynonyms env) }
61+ , typeSynonyms = M.insert (moduleName, name) (args, qualifyAllUnqualifiedNames moduleName env ty) (typeSynonyms env) }
61typeIsNotDefined :: ModuleName -> ProperName -> Check ()
63typeIsNotDefined :: ModuleName -> ProperName -> Check ()
62typeIsNotDefined moduleName name = do
64typeIsNotDefined moduleName name = do
@@ -80,7 +82,7 @@ valueIsNotDefined moduleName name = do
80addValue :: ModuleName -> Ident -> Type -> Check ()
82addValue :: ModuleName -> Ident -> Type -> Check ()
81addValue moduleName name ty = do
83addValue moduleName name ty = do
82 env <- getEnv
84 env <- getEnv
83− putEnv (env { names = M.insert (moduleName, name) (ty, Value) (names env) })
85+ putEnv (env { names = M.insert (moduleName, name) (qualifyAllUnqualifiedNames moduleName env ty, Value) (names env) })
85typeCheckAll :: ModuleName -> [Declaration] -> Check ()
87typeCheckAll :: ModuleName -> [Declaration] -> Check ()
86typeCheckAll _ [] = return ()
88typeCheckAll _ [] = return ()
@@ -132,7 +134,7 @@ typeCheckAll moduleName (ExternDeclaration name _ ty : rest) = do
132 guardWith "Expected kind *" $ kind == Star
134 guardWith "Expected kind *" $ kind == Star
133 case M.lookup (moduleName, name) (names env) of
135 case M.lookup (moduleName, name) (names env) of
134 Just _ -> throwError $ show name ++ " is already defined"
136 Just _ -> throwError $ show name ++ " is already defined"
135− Nothing -> putEnv (env { names = M.insert (moduleName, name) (ty, Extern) (names env) })
137+ Nothing -> putEnv (env { names = M.insert (moduleName, name) (qualifyAllUnqualifiedNames moduleName env ty, Extern) (names env) })
136 typeCheckAll moduleName rest
138 typeCheckAll moduleName rest
137typeCheckAll moduleName (FixityDeclaration _ name : rest) = do
139typeCheckAll moduleName (FixityDeclaration _ name : rest) = do
138 typeCheckAll moduleName rest
140 typeCheckAll moduleName rest
@@ -184,3 +186,10 @@ typeCheckAll currentModule (ImportDeclaration moduleName idents : rest) = do
184 constructs (TypeApp ty _) pn = ty `constructs` pn
186 constructs (TypeApp ty _) pn = ty `constructs` pn
185 constructs fn _ = error $ "Invalid arguments to constructs: " ++ show fn
187 constructs fn _ = error $ "Invalid arguments to constructs: " ++ show fn
189+qualifyAllUnqualifiedNames :: (Data d) => ModuleName -> Environment -> d -> d
190+qualifyAllUnqualifiedNames mn env = everywhere (mkT go)
192+ go :: Qualified ProperName -> Qualified ProperName
193+ go qual = let (mn', pn') = canonicalizeType mn env qual
194+ in Qualified (Just mn') pn'