@@ -262,7 +262,7 @@ data T = MkT -- @NoRefactor: refactor requires GHC >= 9.6.1
262
262
263
263
module Hint.Extensions (extensionsHint ) where
264
264
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 ( .. ) )
266
266
import Extension
267
267
268
268
import Data.Generics.Uniplate.DataOnly
@@ -275,6 +275,7 @@ import Data.Set qualified as Set
275
275
import Data.Map qualified as Map
276
276
277
277
import GHC.Data.FastString
278
+ import GHC.Driver.Session (languageExtensions )
278
279
import GHC.Types.SrcLoc
279
280
import GHC.Types.SourceText
280
281
import GHC.Hs
@@ -298,7 +299,7 @@ import Language.Haskell.GhclibParserEx.GHC.Utils.Outputable
298
299
import Language.Haskell.GhclibParserEx.GHC.Types.Name.Reader
299
300
300
301
extensionsHint :: ModuHint
301
- extensionsHint _ x =
302
+ extensionsHint _ x@ ModuleEx {ghcLanguage} =
302
303
[
303
304
rawIdea Hint.Type. Warning " Unused LANGUAGE pragma"
304
305
(RealSrcSpan (epaLocationRealSrcSpan sl) GHC.Data.Strict. Nothing )
@@ -319,7 +320,7 @@ extensionsHint _ x =
319
320
, let after = filter (maybe True (`Set.member` keep) . snd ) before
320
321
, before /= after
321
322
, let explainedRemovals
322
- | null after && not (any (`Map .member` implied ) $ mapMaybe snd before) = []
323
+ | null after && not (any (`Set .member` impliedExtensions ) $ mapMaybe snd before) = []
323
324
| otherwise = before \\ after
324
325
, let newPragma =
325
326
if null after then " " else comment_ (mkLanguagePragmas sl $ map fst after)
@@ -359,9 +360,18 @@ extensionsHint _ x =
359
360
| e <- Set. toList useful
360
361
, a: _ <- [filter (`Set.member` useful) $ extensionImpliedEnabledBy e]
361
362
]
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
362
372
-- Those we should keep.
363
373
keep :: Set. Set Extension
364
- keep = useful `Set.difference` Map. keysSet implied
374
+ keep = useful `Set.difference` impliedExtensions
365
375
-- The meaning of (a,b) is a used to imply b, but has gone, so
366
376
-- suggest enabling b.
367
377
disappear :: Map. Map Extension [Extension ]
@@ -375,10 +385,14 @@ extensionsHint _ x =
375
385
, usedTH || usedExt a (ghcModule x)
376
386
]
377
387
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"
382
396
383
397
deriveHaskell = [" Eq" ," Ord" ," Enum" ," Ix" ," Bounded" ," Read" ," Show" ]
384
398
deriveGenerics = [" Data" ," Typeable" ," Generic" ," Generic1" ," Lift" ]
0 commit comments