@@ -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 (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
@@ -49,29 +49,16 @@ addDataType moduleName name args dctors ctorKind = do
49addDataConstructor :: ModuleName -> ProperName -> [String] -> ProperName -> [Type] -> Check ()
49addDataConstructor :: ModuleName -> ProperName -> [String] -> ProperName -> [Type] -> Check ()
50addDataConstructor moduleName name args dctor tys = do
50addDataConstructor moduleName name args dctor tys = do
51 env <- getEnv
51 env <- getEnv
52− dataConstructorIsNotDefined moduleName dctor
53 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)
54 let dctorTy = foldr function retTy tys
53 let dctorTy = foldr function retTy tys
55 let polyType = mkForAll args dctorTy
54 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) }
58addTypeSynonym :: ModuleName -> ProperName -> [String] -> Type -> Kind -> Check ()
57addTypeSynonym :: ModuleName -> ProperName -> [String] -> Type -> Kind -> Check ()
59addTypeSynonym moduleName name args ty kind = do
58addTypeSynonym moduleName name args ty kind = do
60 env <- getEnv
59 env <- getEnv
61− putEnv $ env { types = M.insert (moduleName, name) (kind, TypeSynonym) (types env)
60+ putEnv $ env { types = M.insert (Qualified (Just moduleName) name) kind (types env)
62− , typeSynonyms = M.insert (moduleName, name) (args, qualifyAllUnqualifiedNames moduleName env ty) (typeSynonyms env) }
61+ , typeSynonyms = M.insert (Qualified (Just moduleName) name) (args, ty) (typeSynonyms env) }
64−typeIsNotDefined :: ModuleName -> ProperName -> Check ()
65−typeIsNotDefined moduleName name = do
67− guardWith (show name ++ " is already defined") $
68− not $ M.member (moduleName, name) (types env)
70−dataConstructorIsNotDefined :: ModuleName -> ProperName -> Check ()
71−dataConstructorIsNotDefined moduleName dctor = do
73− guardWith (show dctor ++ " is already defined") $
74− not $ M.member (moduleName, dctor) (dataConstructors env)
76valueIsNotDefined :: ModuleName -> Ident -> Check ()
63valueIsNotDefined :: ModuleName -> Ident -> Check ()
77valueIsNotDefined moduleName name = do
64valueIsNotDefined moduleName name = do
@@ -83,7 +70,7 @@ valueIsNotDefined moduleName name = do
83addValue :: ModuleName -> Ident -> Type -> Check ()
70addValue :: ModuleName -> Ident -> Type -> Check ()
84addValue moduleName name ty = do
71addValue moduleName name ty = do
85 env <- getEnv
72 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) })
88addTypeClassDictionaries :: [TypeClassDictionaryInScope] -> Check ()
75addTypeClassDictionaries :: [TypeClassDictionaryInScope] -> Check ()
89addTypeClassDictionaries entries =
76addTypeClassDictionaries entries =
@@ -93,7 +80,7 @@ checkTypeClassInstance :: ModuleName -> Type -> Check ()
93checkTypeClassInstance _ (TypeVar _) = return ()
80checkTypeClassInstance _ (TypeVar _) = return ()
94checkTypeClassInstance m (TypeConstructor ctor) = do
81checkTypeClassInstance m (TypeConstructor ctor) = do
95 env <- getEnv
82 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"
98checkTypeClassInstance m (TypeApp ty (TypeVar _)) = checkTypeClassInstance m ty
85checkTypeClassInstance m (TypeApp ty (TypeVar _)) = checkTypeClassInstance m ty
99checkTypeClassInstance _ _ = throwError "Type class instance must be of the form T a1 ... an"
86checkTypeClassInstance _ _ = throwError "Type class instance must be of the form T a1 ... an"
@@ -115,7 +102,6 @@ typeCheckAll :: Maybe ModuleName -> ModuleName -> [Declaration] -> Check [Declar
115typeCheckAll _ _ [] = return []
102typeCheckAll _ _ [] = return []
116typeCheckAll mainModuleName moduleName (d@(DataDeclaration name args dctors) : rest) = do
103typeCheckAll mainModuleName moduleName (d@(DataDeclaration name args dctors) : rest) = do
117 rethrow (("Error in type constructor " ++ show name ++ ":\n") ++) $ do
104 rethrow (("Error in type constructor " ++ show name ++ ":\n") ++) $ do
118− typeIsNotDefined moduleName name
119 ctorKind <- kindsOf moduleName name args (concatMap snd dctors)
105 ctorKind <- kindsOf moduleName name args (concatMap snd dctors)
120 addDataType moduleName name args dctors ctorKind
106 addDataType moduleName name args dctors ctorKind
121 ds <- typeCheckAll mainModuleName moduleName rest
107 ds <- typeCheckAll mainModuleName moduleName rest
@@ -125,11 +111,9 @@ typeCheckAll mainModuleName moduleName (d@(DataBindingGroupDeclaration tys) : re
125 let syns = mapMaybe toTypeSynonym tys
111 let syns = mapMaybe toTypeSynonym tys
126 let dataDecls = mapMaybe toDataDecl tys
112 let dataDecls = mapMaybe toDataDecl tys
127 (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)
128− forM_ (zip dataDecls data_ks) $ \((name, args, dctors), ctorKind) -> do
114+ forM_ (zip dataDecls data_ks) $ \((name, args, dctors), ctorKind) ->
129− typeIsNotDefined moduleName name
130 addDataType moduleName name args dctors ctorKind
115 addDataType moduleName name args dctors ctorKind
131− forM_ (zip syns syn_ks) $ \((name, args, ty), kind) -> do
116+ forM_ (zip syns syn_ks) $ \((name, args, ty), kind) ->
132− typeIsNotDefined moduleName name
133 addTypeSynonym moduleName name args ty kind
117 addTypeSynonym moduleName name args ty kind
134 ds <- typeCheckAll mainModuleName moduleName rest
118 ds <- typeCheckAll mainModuleName moduleName rest
135 return $ d : ds
119 return $ d : ds
@@ -140,7 +124,6 @@ typeCheckAll mainModuleName moduleName (d@(DataBindingGroupDeclaration tys) : re
140 toDataDecl _ = Nothing
124 toDataDecl _ = Nothing
141typeCheckAll mainModuleName moduleName (d@(TypeSynonymDeclaration name args ty) : rest) = do
125typeCheckAll mainModuleName moduleName (d@(TypeSynonymDeclaration name args ty) : rest) = do
142 rethrow (("Error in type synonym " ++ show name ++ ":\n") ++) $ do
126 rethrow (("Error in type synonym " ++ show name ++ ":\n") ++) $ do
143− typeIsNotDefined moduleName name
144 kind <- kindsOf moduleName name args [ty]
127 kind <- kindsOf moduleName name args [ty]
145 addTypeSynonym moduleName name args ty kind
128 addTypeSynonym moduleName name args ty kind
146 ds <- typeCheckAll mainModuleName moduleName rest
129 ds <- typeCheckAll mainModuleName moduleName rest
@@ -168,8 +151,7 @@ typeCheckAll mainModuleName moduleName (BindingGroupDeclaration vals : rest) = d
168 return $ d : ds
151 return $ d : ds
169typeCheckAll mainModuleName moduleName (d@(ExternDataDeclaration name kind) : rest) = do
152typeCheckAll mainModuleName moduleName (d@(ExternDataDeclaration name kind) : rest) = do
170 env <- getEnv
153 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) }
173 ds <- typeCheckAll mainModuleName moduleName rest
155 ds <- typeCheckAll mainModuleName moduleName rest
174 return $ d : ds
156 return $ d : ds
175typeCheckAll mainModuleName moduleName (d@(ExternDeclaration importTy name _ ty) : rest) = do
157typeCheckAll mainModuleName moduleName (d@(ExternDeclaration importTy name _ ty) : rest) = do
@@ -179,7 +161,7 @@ typeCheckAll mainModuleName moduleName (d@(ExternDeclaration importTy name _ ty)
179 guardWith "Expected kind *" $ kind == Star
161 guardWith "Expected kind *" $ kind == Star
180 case M.lookup (moduleName, name) (names env) of
162 case M.lookup (moduleName, name) (names env) of
181 Just _ -> throwError $ show name ++ " is already defined"
163 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) })
183 ds <- typeCheckAll mainModuleName moduleName rest
165 ds <- typeCheckAll mainModuleName moduleName rest
184 return $ d : ds
166 return $ d : ds
185typeCheckAll mainModuleName moduleName (d@(FixityDeclaration _ name) : rest) = do
167typeCheckAll mainModuleName moduleName (d@(FixityDeclaration _ name) : rest) = do
@@ -194,17 +176,18 @@ typeCheckAll mainModuleName currentModule (d@(ImportDeclaration moduleName ident
194 case idents of
176 case idents of
195 Nothing -> do
177 Nothing -> do
196 shadowIdents (map snd $ filterModule (names env)) env
178 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
198 Just idents' -> do
180 Just idents' -> do
199− shadowIdents (lefts idents') env
181+ shadowIdents (nameImports idents') env
200− shadowTypes (rights idents') env
182+ shadowTypes (typeImports idents') env
201 shadowTypeClassInstances env
183 shadowTypeClassInstances env
202 ds <- typeCheckAll mainModuleName currentModule rest
184 ds <- typeCheckAll mainModuleName currentModule rest
203 return $ d : ds
185 return $ d : ds
205 errorMessage = (("Error in import declaration " ++ show moduleName ++ ":\n") ++)
187 errorMessage = (("Error in import declaration " ++ show moduleName ++ ":\n") ++)
206 filterModule = filter ((== moduleName) . fst) . M.keys
188 filterModule = filter ((== moduleName) . fst) . M.keys
189+ filterModuleQ = filter (\(Qualified (Just mn) _) -> mn == moduleName) . M.keys
207− moduleExists env = not (null (filterModule (names env))) || not (null (filterModule (types env)))
190+ moduleExists env = not (null (filterModule (names env))) || not (null (filterModuleQ (types env)))
208 shadowIdents idents' env =
191 shadowIdents idents' env =
209 forM_ idents' $ \ident ->
192 forM_ idents' $ \ident ->
210 case (moduleName, ident) `M.lookup` names env of
193 case (moduleName, ident) `M.lookup` names env of
@@ -215,19 +198,15 @@ typeCheckAll mainModuleName currentModule (d@(ImportDeclaration moduleName ident
215 Nothing -> throwError (show moduleName ++ "." ++ show ident ++ " is undefined")
198 Nothing -> throwError (show moduleName ++ "." ++ show ident ++ " is undefined")
216 shadowTypes pns env =
199 shadowTypes pns env =
217 forM_ pns $ \pn ->
200 forM_ pns $ \pn ->
218− case (moduleName, pn) `M.lookup` types env of
201+ case Qualified (Just moduleName) pn `M.lookup` types env of
219 Nothing -> throwError (show moduleName ++ "." ++ show pn ++ " is undefined")
202 Nothing -> throwError (show moduleName ++ "." ++ show pn ++ " is undefined")
220− Just (_, DataAlias _ _) -> return ()
221− Just (k, _) -> do
203+ 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) })
204+ modifyEnv (\e -> e { types = M.insert (Qualified (Just currentModule) pn) k (types e) })
224− let keys = map (snd . fst) . filter (\(_, (fn, _)) -> fn `constructs` pn) . M.toList . dataConstructors $ env
205+ let keys = map fst . filter (\(_, fn) -> fn `constructs` pn) . M.toList . dataConstructors $ env
225 forM_ keys $ \dctor ->
206 forM_ keys $ \dctor ->
226− case (moduleName, dctor) `M.lookup` dataConstructors env of
207+ case dctor `M.lookup` dataConstructors env of
227− Just (_, Alias _ _) -> return ()
228− Just (ctorTy, _) -> do
208+ Just ctorTy ->
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) })
209+ modifyEnv (\e -> e { dataConstructors = M.insert dctor ctorTy (dataConstructors e) })
231 Nothing -> throwError (show moduleName ++ "." ++ show dctor ++ " is undefined")
210 Nothing -> throwError (show moduleName ++ "." ++ show dctor ++ " is undefined")
232 shadowTypeClassInstances env = do
211 shadowTypeClassInstances env = do
233 let instances = filter (\tcd ->
212 let instances = filter (\tcd ->
@@ -246,13 +225,12 @@ typeCheckAll mainModuleName currentModule (d@(ImportDeclaration moduleName ident
246typeCheckAll mainModuleName moduleName (d@TypeClassDeclaration{} : rest) = do
225typeCheckAll mainModuleName moduleName (d@TypeClassDeclaration{} : rest) = do
247 env <- getEnv
226 env <- getEnv
248 ds <- typeCheckAll mainModuleName moduleName rest
227 ds <- typeCheckAll mainModuleName moduleName rest
249− return $ qualifyAllUnqualifiedNames moduleName env d : ds
228+ return $ d : ds
250typeCheckAll mainModuleName moduleName (d@(TypeInstanceDeclaration deps className tys _) : rest) = do
229typeCheckAll mainModuleName moduleName (d@(TypeInstanceDeclaration deps className tys _) : rest) = do
251 env <- getEnv
230 env <- getEnv
252 dictName <- Check . lift $ mkDictionaryValueName moduleName className tys
231 dictName <- Check . lift $ mkDictionaryValueName moduleName className tys
253 mapM_ (checkTypeClassInstance moduleName) tys
232 mapM_ (checkTypeClassInstance moduleName) tys
254 forM_ deps $ mapM_ (checkTypeClassInstance moduleName) . snd
233 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]
257 ds <- typeCheckAll mainModuleName moduleName rest
235 ds <- typeCheckAll mainModuleName moduleName rest
258− return $ qualifyAllUnqualifiedNames moduleName env d : ds
236+ return $ d : ds