@@ -166,41 +166,51 @@ typeCheckAll currentModule (d@(ImportDeclaration moduleName idents) : rest) = do
166 Just idents' -> do
166 Just idents' -> do
167 shadowIdents (lefts idents') env
167 shadowIdents (lefts idents') env
168 shadowTypes (rights idents') env
168 shadowTypes (rights idents') env
169+ shadowTypeClassInstances env
169 ds <- typeCheckAll currentModule rest
170 ds <- typeCheckAll currentModule rest
170 return $ d : ds
171 return $ d : ds
171− where errorMessage = (("Error in import declaration " ++ show moduleName ++ ":\n") ++)
173+ errorMessage = (("Error in import declaration " ++ show moduleName ++ ":\n") ++)
172− filterModule = filter ((== moduleName) . fst) . M.keys
174+ filterModule = filter ((== moduleName) . fst) . M.keys
173− moduleExists env = not (null (filterModule (names env))) || not (null (filterModule (types env)))
175+ moduleExists env = not (null (filterModule (names env))) || not (null (filterModule (types env)))
174− shadowIdents idents' env =
176+ shadowIdents idents' env =
175− forM_ idents' $ \ident -> do
177+ forM_ idents' $ \ident -> do
176− case (moduleName, ident) `M.lookup` names env of
178+ case (moduleName, ident) `M.lookup` names env of
177− Just (_, Alias _ _) -> return ()
179+ Just (_, Alias _ _) -> return ()
178− Just (pt, _) -> do
180+ Just (pt, _) -> do
179− guardWith (show currentModule ++ "." ++ show ident ++ " is already defined") $ (currentModule, ident) `M.notMember` names env
181+ guardWith (show currentModule ++ "." ++ show ident ++ " is already defined") $ (currentModule, ident) `M.notMember` names env
180− modifyEnv (\e -> e { names = M.insert (currentModule, ident) (pt, Alias moduleName ident) (names e) })
182+ modifyEnv (\e -> e { names = M.insert (currentModule, ident) (pt, Alias moduleName ident) (names e) })
181− Nothing -> throwError (show moduleName ++ "." ++ show ident ++ " is undefined")
183+ Nothing -> throwError (show moduleName ++ "." ++ show ident ++ " is undefined")
182− shadowTypes pns env =
184+ shadowTypes pns env =
183− forM_ pns $ \pn -> do
185+ forM_ pns $ \pn -> do
184− case (moduleName, pn) `M.lookup` types env of
186+ case (moduleName, pn) `M.lookup` types env of
185− Nothing -> throwError (show moduleName ++ "." ++ show pn ++ " is undefined")
187+ Nothing -> throwError (show moduleName ++ "." ++ show pn ++ " is undefined")
186− Just (_, DataAlias _ _) -> return ()
188+ Just (_, DataAlias _ _) -> return ()
187− Just (k, _) -> do
189+ Just (k, _) -> do
188− guardWith (show currentModule ++ "." ++ show pn ++ " is already defined") $ (currentModule, pn) `M.notMember` types env
190+ guardWith (show currentModule ++ "." ++ show pn ++ " is already defined") $ (currentModule, pn) `M.notMember` types env
189− modifyEnv (\e -> e { types = M.insert (currentModule, pn) (k, DataAlias moduleName pn) (types e) })
191+ modifyEnv (\e -> e { types = M.insert (currentModule, pn) (k, DataAlias moduleName pn) (types e) })
190− let keys = map (snd . fst) . filter (\(_, (fn, _)) -> fn `constructs` pn) . M.toList . dataConstructors $ env
192+ let keys = map (snd . fst) . filter (\(_, (fn, _)) -> fn `constructs` pn) . M.toList . dataConstructors $ env
191− forM_ keys $ \dctor -> do
193+ forM_ keys $ \dctor -> do
192− case (moduleName, dctor) `M.lookup` dataConstructors env of
194+ case (moduleName, dctor) `M.lookup` dataConstructors env of
193− Just (_, Alias _ _) -> return ()
195+ Just (_, Alias _ _) -> return ()
194− Just (ctorTy, _) -> do
196+ Just (ctorTy, _) -> do
195− guardWith (show currentModule ++ "." ++ show dctor ++ " is already defined") $ (currentModule, dctor) `M.notMember` dataConstructors env
197+ guardWith (show currentModule ++ "." ++ show dctor ++ " is already defined") $ (currentModule, dctor) `M.notMember` dataConstructors env
196− modifyEnv (\e -> e { dataConstructors = M.insert (currentModule, dctor) (ctorTy, Alias moduleName (Ident (runProperName dctor))) (dataConstructors e) })
198+ modifyEnv (\e -> e { dataConstructors = M.insert (currentModule, dctor) (ctorTy, Alias moduleName (Ident (runProperName dctor))) (dataConstructors e) })
197− Nothing -> throwError (show moduleName ++ "." ++ show dctor ++ " is undefined")
199+ Nothing -> throwError (show moduleName ++ "." ++ show dctor ++ " is undefined")
200+ shadowTypeClassInstances env = do
201+ let instances = filter (\tcd ->
202+ let Qualified (Just mn) _ = tcdName tcd in
203+ moduleName == mn && tcdType tcd == TCDRegular
204+ ) (typeClassDictionaries env)
205+ forM_ instances $ \tcd -> do
206+ let (Qualified _ ident) = tcdName tcd
207+ addTypeClassDictionaries [tcd { tcdName = (Qualified (Just currentModule) ident), tcdType = TCDAlias (tcdName tcd) }]
198− constructs (TypeConstructor (Qualified (Just mn) pn')) pn
208+ constructs (TypeConstructor (Qualified (Just mn) pn')) pn
199− = mn == moduleName && pn' == pn
209+ = mn == moduleName && pn' == pn
200− constructs (ForAll _ ty) pn = ty `constructs` pn
210+ constructs (ForAll _ ty) pn = ty `constructs` pn
201− constructs (Function _ ty) pn = ty `constructs` pn
211+ constructs (Function _ ty) pn = ty `constructs` pn
202− constructs (TypeApp ty _) pn = ty `constructs` pn
212+ constructs (TypeApp ty _) pn = ty `constructs` pn
203− constructs fn _ = error $ "Invalid arguments to constructs: " ++ show fn
213+ constructs fn _ = error $ "Invalid arguments to constructs: " ++ show fn
204typeCheckAll moduleName (d@(TypeClassDeclaration _ _ _) : rest) = do
214typeCheckAll moduleName (d@(TypeClassDeclaration _ _ _) : rest) = do
205 env <- getEnv
215 env <- getEnv
206 ds <- typeCheckAll moduleName rest
216 ds <- typeCheckAll moduleName rest
@@ -208,6 +218,7 @@ typeCheckAll moduleName (d@(TypeClassDeclaration _ _ _) : rest) = do
208typeCheckAll moduleName (d@(TypeInstanceDeclaration deps className ty _) : rest) = do
218typeCheckAll moduleName (d@(TypeInstanceDeclaration deps className ty _) : rest) = do
209 env <- getEnv
219 env <- getEnv
210 dictName <- Check . lift $ mkDictionaryValueName moduleName className ty
220 dictName <- Check . lift $ mkDictionaryValueName moduleName className ty
211− addTypeClassDictionaries (qualifyAllUnqualifiedNames moduleName env [TypeClassDictionaryInScope dictName className ty (Just deps)])
221+ addTypeClassDictionaries (qualifyAllUnqualifiedNames moduleName env
222+ [TypeClassDictionaryInScope (Qualified (Just moduleName) dictName) className ty (Just deps) TCDRegular])
212 ds <- typeCheckAll moduleName rest
223 ds <- typeCheckAll moduleName rest
213 return $ qualifyAllUnqualifiedNames moduleName env d : ds
224 return $ qualifyAllUnqualifiedNames moduleName env d : ds