@@ -254,7 +254,7 @@ foo = $bar
254
254
255
255
module Hint.Extensions (extensionsHint ) where
256
256
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 ( .. ) )
258
258
import Extension
259
259
260
260
import Data.Generics.Uniplate.DataOnly
@@ -266,6 +266,7 @@ import Refact.Types
266
266
import qualified Data.Set as Set
267
267
import qualified Data.Map as Map
268
268
269
+ import GHC.Driver.Session (languageExtensions )
269
270
import GHC.Types.SrcLoc
270
271
import GHC.Types.SourceText
271
272
import GHC.Hs
@@ -289,7 +290,7 @@ import Language.Haskell.GhclibParserEx.GHC.Utils.Outputable
289
290
import Language.Haskell.GhclibParserEx.GHC.Types.Name.Reader
290
291
291
292
extensionsHint :: ModuHint
292
- extensionsHint _ x =
293
+ extensionsHint _ x@ ModuleEx {ghcLanguage} =
293
294
[
294
295
rawIdea Hint.Type. Warning " Unused LANGUAGE pragma"
295
296
(RealSrcSpan (anchor sl) GHC.Data.Strict. Nothing )
@@ -304,7 +305,7 @@ extensionsHint _ x =
304
305
, let after = filter (maybe True (`Set.member` keep) . snd ) before
305
306
, before /= after
306
307
, let explainedRemovals
307
- | null after && not (any (`Map .member` implied ) $ mapMaybe snd before) = []
308
+ | null after && not (any (`Set .member` impliedExtensions ) $ mapMaybe snd before) = []
308
309
| otherwise = before \\ after
309
310
, let newPragma =
310
311
if null after then " " else comment_ (mkLanguagePragmas sl $ map fst after)
@@ -336,9 +337,18 @@ extensionsHint _ x =
336
337
| e <- Set. toList useful
337
338
, a: _ <- [filter (`Set.member` useful) $ extensionImpliedEnabledBy e]
338
339
]
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
339
349
-- Those we should keep.
340
350
keep :: Set. Set Extension
341
- keep = useful `Set.difference` Map. keysSet implied
351
+ keep = useful `Set.difference` impliedExtensions
342
352
-- The meaning of (a,b) is a used to imply b, but has gone, so
343
353
-- suggest enabling b.
344
354
disappear :: Map. Map Extension [Extension ]
@@ -352,10 +362,14 @@ extensionsHint _ x =
352
362
, usedTH || usedExt a (ghcModule x)
353
363
]
354
364
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"
359
373
360
374
deriveHaskell = [" Eq" ," Ord" ," Enum" ," Ix" ," Bounded" ," Read" ," Show" ]
361
375
deriveGenerics = [" Data" ," Typeable" ," Generic" ," Generic1" ," Lift" ]
0 commit comments