Skip to content

Commit b2c3f10

Browse files
committed
Mark extensions implied by language as unused
1 parent 4681c81 commit b2c3f10

File tree

2 files changed

+39
-8
lines changed

2 files changed

+39
-8
lines changed

src/Hint/Extensions.hs

+22-8
Original file line numberDiff line numberDiff line change
@@ -254,7 +254,7 @@ foo = $bar
254254

255255
module Hint.Extensions(extensionsHint) where
256256

257-
import Hint.Type(ModuHint,rawIdea,Severity(Warning),Note(..),toSSAnc,ghcModule,modComments)
257+
import Hint.Type(ModuHint,rawIdea,Severity(Warning),Note(..),toSSAnc,ghcModule,modComments,ModuleEx (..))
258258
import Extension
259259

260260
import Data.Generics.Uniplate.DataOnly
@@ -266,6 +266,7 @@ import Refact.Types
266266
import qualified Data.Set as Set
267267
import qualified Data.Map as Map
268268

269+
import GHC.Driver.Session (languageExtensions)
269270
import GHC.Types.SrcLoc
270271
import GHC.Types.SourceText
271272
import GHC.Hs
@@ -289,7 +290,7 @@ import Language.Haskell.GhclibParserEx.GHC.Utils.Outputable
289290
import Language.Haskell.GhclibParserEx.GHC.Types.Name.Reader
290291

291292
extensionsHint :: ModuHint
292-
extensionsHint _ x =
293+
extensionsHint _ x@ModuleEx{ghcLanguage} =
293294
[
294295
rawIdea Hint.Type.Warning "Unused LANGUAGE pragma"
295296
(RealSrcSpan (anchor sl) GHC.Data.Strict.Nothing)
@@ -304,7 +305,7 @@ extensionsHint _ x =
304305
, let after = filter (maybe True (`Set.member` keep) . snd) before
305306
, before /= after
306307
, let explainedRemovals
307-
| null after && not (any (`Map.member` implied) $ mapMaybe snd before) = []
308+
| null after && not (any (`Set.member` impliedExtensions) $ mapMaybe snd before) = []
308309
| otherwise = before \\ after
309310
, let newPragma =
310311
if null after then "" else comment_ (mkLanguagePragmas sl $ map fst after)
@@ -336,9 +337,18 @@ extensionsHint _ x =
336337
| e <- Set.toList useful
337338
, a:_ <- [filter (`Set.member` useful) $ extensionImpliedEnabledBy e]
338339
]
340+
impliedByLanguage :: Set.Set Extension
341+
impliedByLanguage = case ghcLanguage of
342+
Just l -> Set.fromList $ languageExtensions (Just l)
343+
-- If we pass 'Nothing' to 'languageExtensions', the latest language
344+
-- (i.e. GHC2021) is used; which might be unexpected for users on older
345+
-- GHC versions where GHC2021 doesn't even exist yet.
346+
Nothing -> Set.empty
347+
impliedExtensions :: Set.Set Extension
348+
impliedExtensions = Map.keysSet implied `Set.union` impliedByLanguage
339349
-- Those we should keep.
340350
keep :: Set.Set Extension
341-
keep = useful `Set.difference` Map.keysSet implied
351+
keep = useful `Set.difference` impliedExtensions
342352
-- The meaning of (a,b) is a used to imply b, but has gone, so
343353
-- suggest enabling b.
344354
disappear :: Map.Map Extension [Extension]
@@ -352,10 +362,14 @@ extensionsHint _ x =
352362
, usedTH || usedExt a (ghcModule x)
353363
]
354364
reason :: Extension -> String
355-
reason x =
356-
case Map.lookup x implied of
357-
Just a -> "implied by " ++ show a
358-
Nothing -> "not used"
365+
reason x
366+
| Just a <- Map.lookup x implied
367+
= "implied by " ++ show a
368+
| x `Set.member` impliedByLanguage
369+
, Just l <- ghcLanguage
370+
= "implied by " ++ show l
371+
| otherwise
372+
= "not used"
359373

360374
deriveHaskell = ["Eq","Ord","Enum","Ix","Bounded","Read","Show"]
361375
deriveGenerics = ["Data","Typeable","Generic","Generic1","Lift"]

tests/ghc2021.test

+17
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
---------------------------------------------------------------------
2+
RUN tests/ghc2021.hs
3+
FILE tests/ghc2021.hs
4+
{-# LANGUAGE FlexibleContexts #-}
5+
OUTPUT
6+
No hints
7+
8+
---------------------------------------------------------------------
9+
RUN tests/ghc2021.hs -XGHC2021
10+
OUTPUT
11+
tests/ghc2021.hs:1:1-33: Warning: Unused LANGUAGE pragma
12+
Found:
13+
{-# LANGUAGE FlexibleContexts #-}
14+
Perhaps you should remove it.
15+
Note: Extension FlexibleContexts is implied by GHC2021
16+
17+
1 hint

0 commit comments

Comments
 (0)