Skip to content

Commit d296351

Browse files
friedbrice9999years
authored andcommitted
Add support for NumericUnderscores extensions from CLI/config
Closes #1434
1 parent ad9a1f8 commit d296351

File tree

6 files changed

+27
-10
lines changed

6 files changed

+27
-10
lines changed

src/GHC/All.hs

Lines changed: 15 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,9 @@ module GHC.All(
66
CppFlags(..), ParseFlags(..), defaultParseFlags,
77
parseFlagsAddFixities, parseFlagsSetLanguage,
88
ParseError(..), ModuleEx(..),
9-
parseModuleEx, createModuleEx, createModuleExWithFixities, ghcComments, modComments, firstDeclComments,
9+
parseModuleEx, createModuleEx, createModuleExWithFixities,
10+
createModuleExWithFixitiesAndExtensions, ghcComments, modComments,
11+
firstDeclComments,
1012
parseExpGhcWithMode, parseImportDeclGhcWithMode, parseDeclGhcWithMode,
1113
) where
1214

@@ -86,8 +88,9 @@ data ParseError = ParseError
8688
}
8789

8890
-- | Result of 'parseModuleEx', representing a parsed module.
89-
newtype ModuleEx = ModuleEx {
90-
ghcModule :: Located (HsModule GhcPs)
91+
data ModuleEx = ModuleEx {
92+
ghcModule :: Located (HsModule GhcPs),
93+
configuredExtensions :: [Extension]
9194
}
9295

9396
-- | Extract a complete list of all the comments in a module.
@@ -160,8 +163,14 @@ createModuleEx :: Located (HsModule GhcPs) -> ModuleEx
160163
createModuleEx = createModuleExWithFixities (map toFixity defaultFixities)
161164

162165
createModuleExWithFixities :: [(String, Fixity)] -> Located (HsModule GhcPs) -> ModuleEx
163-
createModuleExWithFixities fixities ast =
164-
ModuleEx (applyFixities (fixitiesFromModule ast ++ fixities) ast)
166+
createModuleExWithFixities = createModuleExWithFixitiesAndExtensions []
167+
168+
-- | Create a 'ModuleEx' from a GHC module. Provide a list of custom operator
169+
-- fixities and a list of GHC extensions that should be used when parsing the module
170+
-- (if there are any extensions required other than those explicitly enabled in the module).
171+
createModuleExWithFixitiesAndExtensions :: [Extension] -> [(String, Fixity)] -> Located (HsModule GhcPs) -> ModuleEx
172+
createModuleExWithFixitiesAndExtensions extensions fixities ast =
173+
ModuleEx (applyFixities (fixitiesFromModule ast ++ fixities) ast) extensions
165174

166175
-- | Parse a Haskell module. Applies the C pre processor, and uses
167176
-- best-guess fixity resolution if there are ambiguities. The
@@ -197,7 +206,7 @@ parseModuleEx flags file str = timedIO "Parse" file $ runExceptT $ do
197206
ExceptT $ parseFailureErr dynFlags str file str $ NE.fromList errs
198207
else do
199208
let fixes = fixitiesFromModule a ++ ghcFixitiesFromParseFlags flags
200-
pure $ ModuleEx (applyFixities fixes a)
209+
pure $ ModuleEx (applyFixities fixes a) (enabledExtensions flags)
201210
PFailed s ->
202211
ExceptT $ parseFailureErr dynFlags str file str $ NE.fromList . bagToList . getMessages $ GhcPsMessage <$> snd (getPsMessages s)
203212
where

src/Hint/Duplicate.hs

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

6464
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
@@ -21,7 +21,7 @@ import GHC.Types.Name.Occurrence
2121
import GHC.Types.Name.Reader
2222

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

src/Hint/NumLiteral.hs

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,13 +21,15 @@
2121

2222
module Hint.NumLiteral (numLiteralHint) where
2323

24+
import GHC.All (configuredExtensions)
2425
import GHC.Hs
2526
import GHC.Data.FastString
2627
import GHC.LanguageExtensions.Type (Extension (..))
2728
import GHC.Types.SrcLoc
2829
import GHC.Types.SourceText
2930
import GHC.Util.ApiAnnotation (extensions)
3031
import Data.Char (isDigit, isOctDigit, isHexDigit)
32+
import Data.Foldable (toList)
3133
import Data.List (intercalate)
3234
import Data.Set (union)
3335
import Data.Generics.Uniplate.DataOnly (universeBi)
@@ -43,10 +45,16 @@ numLiteralHint _ modu =
4345
-- not the module so to be safe, look also at `firstDeclComments
4446
-- modu` (https://gitlab.haskell.org/ghc/ghc/-/merge_requests/9517).
4547
let exts = union (extensions (modComments modu)) (extensions (firstDeclComments modu)) in
48+
-- TODO: there's a subtle bug when the module disables `NumericUnderscores`.
49+
-- This seems pathological, though, because who would enable it for their
50+
-- project but disable it in specific files?
4651
if NumericUnderscores `elem` exts then
4752
concatMap suggestUnderscore . universeBi
4853
else
4954
const []
55+
where
56+
moduleExtensions = union (extensions (modComments modu)) (extensions (firstDeclComments modu))
57+
activeExtensions = configuredExtensions modu <> toList moduleExtensions
5058

5159
suggestUnderscore :: LHsExpr GhcPs -> [Idea]
5260
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
@@ -24,7 +24,7 @@ module Language.Haskell.HLint(
2424
-- * Hints
2525
Hint,
2626
-- * Modules
27-
ModuleEx, parseModuleEx, createModuleEx, createModuleExWithFixities, ParseError(..),
27+
ModuleEx, parseModuleEx, createModuleEx, createModuleExWithFixities, createModuleExWithFixitiesAndExtensions, ParseError(..),
2828
-- * Parse flags
2929
defaultParseFlags,
3030
ParseFlags(..), CppFlags(..), FixityInfo,

0 commit comments

Comments
 (0)