@@ -262,7 +262,7 @@ data T = MkT -- @NoRefactor: refactor requires GHC >= 9.6.1
262262
263263module 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 ( .. ) )
266266import Extension
267267
268268import Data.Generics.Uniplate.DataOnly
@@ -275,6 +275,7 @@ import Data.Set qualified as Set
275275import Data.Map qualified as Map
276276
277277import GHC.Data.FastString
278+ import GHC.Driver.Session (languageExtensions )
278279import GHC.Types.SrcLoc
279280import GHC.Types.SourceText
280281import GHC.Hs
@@ -298,7 +299,7 @@ import Language.Haskell.GhclibParserEx.GHC.Utils.Outputable
298299import Language.Haskell.GhclibParserEx.GHC.Types.Name.Reader
299300
300301extensionsHint :: 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
383397deriveHaskell = [" Eq" ," Ord" ," Enum" ," Ix" ," Bounded" ," Read" ," Show" ]
384398deriveGenerics = [" Data" ," Typeable" ," Generic" ," Generic1" ," Lift" ]
0 commit comments