@@ -38,15 +38,16 @@ findUnusedImports :: forall m. (Applicative m, MonadError MultipleErrors m, Mona
38findUnusedImports (Module _ _ _ mdecls mexports) env usedImps = do
38findUnusedImports (Module _ _ _ mdecls mexports) env usedImps = do
39 imps <- findImports mdecls
39 imps <- findImports mdecls
40 forM_ (M.toAscList imps) $ \(mni, decls) -> unless (mni `elem` alwaysUsedModules) $
40 forM_ (M.toAscList imps) $ \(mni, decls) -> unless (mni `elem` alwaysUsedModules) $
41− forM_ decls $ \(ss, declType, qualifierName) -> censor (onErrorMessages $ addModuleLocError ss) $
41+ forM_ decls $ \(ss, declType, qualifierName) ->
42+ censor (onErrorMessages $ addModuleLocError ss) $ unless (qnameUsed qualifierName) $
42− let usedNames = mapMaybe (matchName (typeForDCtor mni) qualifierName) $ sugarNames mni ++ M.findWithDefault [] mni usedImps in
43+ let usedNames = mapMaybe (matchName (typeForDCtor mni) qualifierName) $ sugarNames mni ++ M.findWithDefault [] mni usedImps in
43− case declType of
44+ case declType of
44− Implicit -> when (null usedNames) $ tell $ errorMessage $ UnusedImport mni
45+ Implicit -> when (null usedNames) $ tell $ errorMessage $ UnusedImport mni
45− Explicit declrefs -> do
46+ Explicit declrefs -> do
46− let idents = mapMaybe runDeclRef declrefs
47+ let idents = mapMaybe runDeclRef declrefs
47− let diff = idents \\ usedNames
48+ let diff = idents \\ usedNames
48− unless (null diff) $ tell $ errorMessage $ UnusedExplicitImport mni diff
49+ unless (null diff) $ tell $ errorMessage $ UnusedExplicitImport mni diff
49− _ -> return ()
50+ _ -> return ()
51 sugarNames :: ModuleName -> [ Name ]
52 sugarNames :: ModuleName -> [ Name ]
52 sugarNames (ModuleName [ProperName n]) | n == C.prelude = [ IdentName $ Qualified Nothing (Ident C.bind) ]
53 sugarNames (ModuleName [ProperName n]) | n == C.prelude = [ IdentName $ Qualified Nothing (Ident C.bind) ]
@@ -59,6 +60,10 @@ findUnusedImports (Module _ _ _ mdecls mexports) env usedImps = do
59 isExport (ModuleRef mn) = Just mn
60 isExport (ModuleRef mn) = Just mn
60 isExport _ = Nothing
61 isExport _ = Nothing
63+ qnameUsed :: Maybe ModuleName -> Bool
64+ qnameUsed (Just qn) = qn `elem` alwaysUsedModules
65+ qnameUsed Nothing = False
62 typeForDCtor :: ModuleName -> ProperName -> Maybe ProperName
67 typeForDCtor :: ModuleName -> ProperName -> Maybe ProperName
63 typeForDCtor mn pn =
68 typeForDCtor mn pn =
64 getTy <$> find matches tys
69 getTy <$> find matches tys