Skip to content

Commit 36a86e9

Browse files
committed
Add support for NumericUnderscores extensions from CLI/config
Closes ndmitchell#1434
1 parent 98c4479 commit 36a86e9

File tree

6 files changed

+26
-11
lines changed

6 files changed

+26
-11
lines changed

src/GHC/All.hs

Lines changed: 13 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ module GHC.All(
55
CppFlags(..), ParseFlags(..), defaultParseFlags,
66
parseFlagsAddFixities, parseFlagsSetLanguage,
77
ParseError(..), ModuleEx(..),
8-
parseModuleEx, createModuleEx, createModuleExWithFixities, ghcComments, modComments,
8+
parseModuleEx, createModuleEx, createModuleExWithFixities, createModuleExWithFixitiesAndExtensions, ghcComments, modComments,
99
parseExpGhcWithMode, parseImportDeclGhcWithMode, parseDeclGhcWithMode,
1010
) where
1111

@@ -84,8 +84,9 @@ data ParseError = ParseError
8484
}
8585

8686
-- | Result of 'parseModuleEx', representing a parsed module.
87-
newtype ModuleEx = ModuleEx {
88-
ghcModule :: Located HsModule
87+
data ModuleEx = ModuleEx {
88+
ghcModule :: Located HsModule,
89+
hlintExtensions :: [Extension]
8990
}
9091

9192
-- | Extract a complete list of all the comments in a module.
@@ -151,8 +152,14 @@ createModuleEx :: Located HsModule -> ModuleEx
151152
createModuleEx = createModuleExWithFixities (map toFixity defaultFixities)
152153

153154
createModuleExWithFixities :: [(String, Fixity)] -> Located HsModule -> ModuleEx
154-
createModuleExWithFixities fixities ast =
155-
ModuleEx (applyFixities (fixitiesFromModule ast ++ fixities) ast)
155+
createModuleExWithFixities = createModuleExWithFixitiesAndExtensions []
156+
157+
-- | Create a 'ModuleEx' from a GHC module. Provide a list of custom operator
158+
-- fixities and a list of GHC extensions that should be used when parsing the module
159+
-- (if there are any extensions required other than those explicitly enabled in the module).
160+
createModuleExWithFixitiesAndExtensions :: [Extension] -> [(String, Fixity)] -> Located HsModule -> ModuleEx
161+
createModuleExWithFixitiesAndExtensions extensions fixities ast =
162+
ModuleEx (applyFixities (fixitiesFromModule ast ++ fixities) ast) extensions
156163

157164
-- | Parse a Haskell module. Applies the C pre processor, and uses
158165
-- best-guess fixity resolution if there are ambiguities. The
@@ -188,7 +195,7 @@ parseModuleEx flags file str = timedIO "Parse" file $ runExceptT $ do
188195
ExceptT $ parseFailureErr dynFlags str file str errs
189196
else do
190197
let fixes = fixitiesFromModule a ++ ghcFixitiesFromParseFlags flags
191-
pure $ ModuleEx (applyFixities fixes a)
198+
pure $ ModuleEx (applyFixities fixes a) (enabledExtensions flags)
192199
PFailed s ->
193200
ExceptT $ parseFailureErr dynFlags str file str $ bagToList . getMessages $ GhcPsMessage <$> snd (getPsMessages s)
194201
where

src/Hint/Duplicate.hs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,7 @@ duplicateHint ms =
5757
]
5858
where
5959
ds = [(modName m, fromMaybe "" (declName d), unLoc d)
60-
| ModuleEx m <- map snd ms
60+
| ModuleEx m _ <- map snd ms
6161
, d <- hsmodDecls (unLoc m)]
6262

6363
dupes :: (Outputable e, Data e) => [(String, String, [LocatedA e])] -> [Idea]

src/Hint/Export.hs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ import GHC.Types.Name.Occurrence
2222
import GHC.Types.Name.Reader
2323

2424
exportHint :: ModuHint
25-
exportHint _ (ModuleEx (L s m@HsModule {hsmodName = Just name, hsmodExports = exports}) )
25+
exportHint _ (ModuleEx (L s m@HsModule {hsmodName = Just name, hsmodExports = exports}) _)
2626
| Nothing <- exports =
2727
let r = o{ hsmodExports = Just (noLocA [noLocA (IEModuleContents EpAnnNotUsed name)] )} in
2828
[(ignore "Use module export list" (L s o) (noLoc r) []){ideaNote = [Note "an explicit list is usually better"]}]

src/Hint/NumLiteral.hs

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,12 +19,14 @@
1919

2020
module Hint.NumLiteral (numLiteralHint) where
2121

22+
import GHC.All (hlintExtensions)
2223
import GHC.Hs
2324
import GHC.LanguageExtensions.Type (Extension (..))
2425
import GHC.Types.SrcLoc
2526
import GHC.Types.SourceText
2627
import GHC.Util.ApiAnnotation (extensions)
2728
import Data.Char (isDigit, isOctDigit, isHexDigit)
29+
import Data.Foldable (toList)
2830
import Data.List (intercalate)
2931
import Data.Generics.Uniplate.DataOnly (universeBi)
3032
import Refact.Types
@@ -34,10 +36,16 @@ import Idea (Idea, suggest)
3436

3537
numLiteralHint :: DeclHint
3638
numLiteralHint _ modu =
37-
if NumericUnderscores `elem` extensions (modComments modu) then
39+
-- TODO: there's a subtle bug when the module disables `NumericUnderscores`.
40+
-- This seems pathological, though, because who would enable it for their
41+
-- project but disable it in specific files?
42+
if NumericUnderscores `elem` activeExtensions then
3843
concatMap suggestUnderscore . universeBi
3944
else
4045
const []
46+
where
47+
moduleExtensions = toList (extensions $ modComments modu)
48+
activeExtensions = hlintExtensions modu <> toList moduleExtensions
4149

4250
suggestUnderscore :: LHsExpr GhcPs -> [Idea]
4351
suggestUnderscore x@(L _ (HsOverLit _ ol@(OverLit _ (HsIntegral intLit@(IL (SourceText srcTxt) _ _))))) =

src/Hint/Unsafe.hs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@ import Language.Haskell.GhclibParserEx.GHC.Utils.Outputable
4646
-- @
4747
-- is. We advise that such constants should have a @NOINLINE@ pragma.
4848
unsafeHint :: DeclHint
49-
unsafeHint _ (ModuleEx (L _ m)) = \ld@(L loc d) ->
49+
unsafeHint _ (ModuleEx (L _ m) _) = \ld@(L loc d) ->
5050
[rawIdea Hint.Type.Warning "Missing NOINLINE pragma" (locA loc)
5151
(unsafePrettyPrint d)
5252
(Just $ trimStart (unsafePrettyPrint $ gen x) ++ "\n" ++ unsafePrettyPrint d)

src/Language/Haskell/HLint.hs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ module Language.Haskell.HLint(
2323
-- * Hints
2424
Hint,
2525
-- * Modules
26-
ModuleEx, parseModuleEx, createModuleEx, createModuleExWithFixities, ParseError(..),
26+
ModuleEx, parseModuleEx, createModuleEx, createModuleExWithFixities, createModuleExWithFixitiesAndExtensions, ParseError(..),
2727
-- * Parse flags
2828
defaultParseFlags,
2929
ParseFlags(..), CppFlags(..), FixityInfo,

0 commit comments

Comments
 (0)