Skip to content

Commit bf8ca0e

Browse files
committed
Mark extensions implied by language as unused
1 parent 74297f3 commit bf8ca0e

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
@@ -262,7 +262,7 @@ data T = MkT -- @NoRefactor: refactor requires GHC >= 9.6.1
262262

263263
module Hint.Extensions(extensionsHint) where
264264

265-
import Hint.Type(ModuHint,rawIdea,Severity(Warning),Note(..),toSSAnc,ghcModule,modComments,firstDeclComments)
265+
import Hint.Type(ModuHint,rawIdea,Severity(Warning),Note(..),toSSAnc,ghcModule,modComments,firstDeclComments,ModuleEx (..))
266266
import Extension
267267

268268
import Data.Generics.Uniplate.DataOnly
@@ -275,6 +275,7 @@ import Data.Set qualified as Set
275275
import Data.Map qualified as Map
276276

277277
import GHC.Data.FastString
278+
import GHC.Driver.Session (languageExtensions)
278279
import GHC.Types.SrcLoc
279280
import GHC.Types.SourceText
280281
import GHC.Hs
@@ -298,7 +299,7 @@ import Language.Haskell.GhclibParserEx.GHC.Utils.Outputable
298299
import Language.Haskell.GhclibParserEx.GHC.Types.Name.Reader
299300

300301
extensionsHint :: ModuHint
301-
extensionsHint _ x =
302+
extensionsHint _ x@ModuleEx{ghcLanguage} =
302303
[
303304
rawIdea Hint.Type.Warning "Unused LANGUAGE pragma"
304305
(RealSrcSpan (epaLocationRealSrcSpan sl) GHC.Data.Strict.Nothing)
@@ -319,7 +320,7 @@ extensionsHint _ x =
319320
, let after = filter (maybe True (`Set.member` keep) . snd) before
320321
, before /= after
321322
, let explainedRemovals
322-
| null after && not (any (`Map.member` implied) $ mapMaybe snd before) = []
323+
| null after && not (any (`Set.member` impliedExtensions) $ mapMaybe snd before) = []
323324
| otherwise = before \\ after
324325
, let newPragma =
325326
if null after then "" else comment_ (mkLanguagePragmas sl $ map fst after)
@@ -359,9 +360,18 @@ extensionsHint _ x =
359360
| e <- Set.toList useful
360361
, a:_ <- [filter (`Set.member` useful) $ extensionImpliedEnabledBy e]
361362
]
363+
impliedByLanguage :: Set.Set Extension
364+
impliedByLanguage = case ghcLanguage of
365+
Just l -> Set.fromList $ languageExtensions (Just l)
366+
-- If we pass 'Nothing' to 'languageExtensions', the latest language
367+
-- (i.e. GHC2021) is used; which might be unexpected for users on older
368+
-- GHC versions where GHC2021 doesn't even exist yet.
369+
Nothing -> Set.empty
370+
impliedExtensions :: Set.Set Extension
371+
impliedExtensions = Map.keysSet implied `Set.union` impliedByLanguage
362372
-- Those we should keep.
363373
keep :: Set.Set Extension
364-
keep = useful `Set.difference` Map.keysSet implied
374+
keep = useful `Set.difference` impliedExtensions
365375
-- The meaning of (a,b) is a used to imply b, but has gone, so
366376
-- suggest enabling b.
367377
disappear :: Map.Map Extension [Extension]
@@ -375,10 +385,14 @@ extensionsHint _ x =
375385
, usedTH || usedExt a (ghcModule x)
376386
]
377387
reason :: Extension -> String
378-
reason x =
379-
case Map.lookup x implied of
380-
Just a -> "implied by " ++ show a
381-
Nothing -> "not used"
388+
reason x
389+
| Just a <- Map.lookup x implied
390+
= "implied by " ++ show a
391+
| x `Set.member` impliedByLanguage
392+
, Just l <- ghcLanguage
393+
= "implied by " ++ show l
394+
| otherwise
395+
= "not used"
382396

383397
deriveHaskell = ["Eq","Ord","Enum","Ix","Bounded","Read","Show"]
384398
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)