hlint 3.0 → 3.0.1
raw patch · 3 files changed
+15/−23 lines, 3 filesPVP ok
version bump matches the API change (PVP)
API changes (from Hackage documentation)
Files
- CHANGES.txt +2/−0
- hlint.cabal +1/−1
- src/Hint/Extensions.hs +12/−22
CHANGES.txt view
@@ -1,5 +1,7 @@ Changelog for HLint (* = breaking change) +3.0.1, released 2020-05-02+ #961, don't crash on non-extension LANGUAGE pragmas, e.g. Safe 3.0, released 2020-05-02 Be more permissive with names'with'quotes'in #953, fix incorrect suggestions with free variables and \case
hlint.cabal view
@@ -1,7 +1,7 @@ cabal-version: >= 1.18 build-type: Simple name: hlint-version: 3.0+version: 3.0.1 license: BSD3 license-file: LICENSE category: Development
src/Hint/Extensions.hs view
@@ -193,6 +193,9 @@ {-# LANGUAGE NamedFieldPuns #-} -- {-# LANGUAGE StaticPointers #-} \ static = 42 --+{-# LANGUAGE Trustworthy #-}+{-# LANGUAGE Trustworthy, NamedFieldPuns #-} -- {-# LANGUAGE Trustworthy #-}+{-# LANGUAGE Haskell2010 #-} </TEST> -} @@ -205,6 +208,7 @@ import Data.Generics.Uniplate.Operations import Control.Monad.Extra import Data.Char+import Data.Maybe import Data.List.Extra import Data.Data import Refact.Types@@ -234,37 +238,24 @@ sl (comment (mkLangExts sl exts)) (Just newPragma)- ( [RequiresExtension (show gone) | x <- before \\ after, gone <- Map.findWithDefault [] x disappear] +++ ( [RequiresExtension (show gone) | (_, Just x) <- before \\ after, gone <- Map.findWithDefault [] x disappear] ++ [ Note $ "Extension " ++ show x ++ " is " ++ reason x- | x <- explainedRemovals])+ | (_, Just x) <- explainedRemovals]) [ModifyComment (toSS' (mkLangExts sl exts)) newPragma] | (L sl _, exts) <- langExts $ pragmas (ghcAnnotations x)- , let before = map lookupExt (filterEnabled exts)- , let after = filter (`Set.member` keep) before+ , let before = [(x, readExtension x) | x <- filterEnabled exts]+ , let after = filter (maybe True (`Set.member` keep) . snd) before , before /= after , let explainedRemovals- | null after && not (any (`Map.member` implied) before) = []+ | null after && not (any (`Map.member` implied) $ mapMaybe snd before) = [] | otherwise = before \\ after , let newPragma =- if null after then "" else comment (mkLangExts sl $ map show after)+ if null after then "" else comment (mkLangExts sl $ map fst after) ] where filterEnabled :: [String] -> [String] filterEnabled = filter (not . isPrefixOf "No") - lookupExt :: String -> Extension- lookupExt s = case readExtension s of- Just ext -> ext- Nothing ->- -- Validity checking of extensions happens when the parse- -- tree is constructed (via 'getOptions' called from- -- 'parsePragmasIntoDynFlags'). If an invalid extension is- -- encountered, it results in a parse error (see- -- tests/ignore-parse-error3.hs in- -- 'tests/parse-error.test'). Thus we are assured that the- -- argument 's' must be in 'xFlags' and this case impossible.- error ("IMPOSSIBLE: Unrecognized language extension '" ++ s ++ "'")- usedTH :: Bool usedTH = used TemplateHaskell (ghcModule x) || used QuasiQuotes (ghcModule x) -- If TH or QuasiQuotes is on, can use all other extensions@@ -272,9 +263,8 @@ -- All the extensions defined to be used. extensions :: Set.Set Extension- extensions = Set.fromList $ [ lookupExt e- | let exts = concatMap (filterEnabled . snd) $ langExts (pragmas (ghcAnnotations x))- , e <- exts ]+ extensions = Set.fromList $ mapMaybe readExtension $+ concatMap (filterEnabled . snd) $ langExts (pragmas (ghcAnnotations x)) -- Those extensions we detect to be useful. useful :: Set.Set Extension