@@ -155,22 +155,27 @@ typeCheckAll currentModule (ImportDeclaration moduleName idents : rest) = do
155155 moduleExists env = not (null (filterModule (names env))) || not (null (filterModule (types env)))
156156 shadowIdents idents' env =
157157 forM_ idents' $ \ident -> do
158− guardWith (show currentModule ++ "." ++ show ident ++ " is already defined") $ (currentModule, ident) `M.notMember` names env
159158 case (moduleName, ident) `M.lookup` names env of
160− Just (pt, _) -> modifyEnv (\e -> e { names = M.insert (currentModule, ident) (pt, Alias moduleName ident) (names e) })
159+ Just (_, Alias _ _) -> return ()
160+ Just (pt, _) -> do
161+ guardWith (show currentModule ++ "." ++ show ident ++ " is already defined") $ (currentModule, ident) `M.notMember` names env
162+ modifyEnv (\e -> e { names = M.insert (currentModule, ident) (pt, Alias moduleName ident) (names e) })
161163 Nothing -> throwError (show moduleName ++ "." ++ show ident ++ " is undefined")
162164 shadowTypes pns env =
163165 forM_ pns $ \pn -> do
164− guardWith (show currentModule ++ "." ++ show pn ++ " is already defined") $ (currentModule, pn) `M.notMember` types env
165166 case (moduleName, pn) `M.lookup` types env of
166167 Nothing -> throwError (show moduleName ++ "." ++ show pn ++ " is undefined")
168+ Just (_, DataAlias _ _) -> return ()
167169 Just (k, _) -> do
170+ guardWith (show currentModule ++ "." ++ show pn ++ " is already defined") $ (currentModule, pn) `M.notMember` types env
168171 modifyEnv (\e -> e { types = M.insert (currentModule, pn) (k, DataAlias moduleName pn) (types e) })
169172 let keys = map (snd . fst) . filter (\(_, (fn, _)) -> fn `constructs` pn) . M.toList . dataConstructors $ env
170173 forM_ keys $ \dctor -> do
171− guardWith (show currentModule ++ "." ++ show dctor ++ " is already defined") $ (currentModule, dctor) `M.notMember` dataConstructors env
172174 case (moduleName, dctor) `M.lookup` dataConstructors env of
173− Just (ctorTy, _) -> modifyEnv (\e -> e { dataConstructors = M.insert (currentModule, dctor) (ctorTy, Alias moduleName (Ident (runProperName dctor))) (dataConstructors e) })
175+ Just (_, Alias _ _) -> return ()
176+ Just (ctorTy, _) -> do
177+ guardWith (show currentModule ++ "." ++ show dctor ++ " is already defined") $ (currentModule, dctor) `M.notMember` dataConstructors env
178+ modifyEnv (\e -> e { dataConstructors = M.insert (currentModule, dctor) (ctorTy, Alias moduleName (Ident (runProperName dctor))) (dataConstructors e) })
174179 Nothing -> throwError (show moduleName ++ "." ++ show dctor ++ " is undefined")
175180 constructs (TypeConstructor (Qualified (Just mn) pn')) pn
176181 = mn == moduleName && pn' == pn