From eeb9bb0dc843c63624fe4d04fa82aa47544a23c7 Mon Sep 17 00:00:00 2001 From: Shayne Fletcher Date: Thu, 12 Oct 2023 21:21:33 -0400 Subject: [PATCH] [ghc-api]: upgrade to ghc-9.8 --- hlint.cabal | 8 ++++---- src/Config/Yaml.hs | 2 +- src/GHC/Util/FreeVars.hs | 6 +++--- src/GHC/Util/HsExpr.hs | 6 +++--- src/Hint/Export.hs | 4 ++-- src/Hint/Extensions.hs | 5 +++-- src/Hint/Lambda.hs | 2 +- src/Hint/ListRec.hs | 2 +- src/Hint/Monad.hs | 2 +- src/Hint/Naming.hs | 2 +- src/Hint/NumLiteral.hs | 15 +++++++++------ src/Hint/Unsafe.hs | 6 ++++-- stack.yaml | 8 ++++---- 13 files changed, 37 insertions(+), 31 deletions(-) diff --git a/hlint.cabal b/hlint.cabal index 5b9a75c8b..a83af3820 100644 --- a/hlint.cabal +++ b/hlint.cabal @@ -81,16 +81,16 @@ library deriving-aeson >= 0.2, filepattern >= 0.1.1 - if !flag(ghc-lib) && impl(ghc >= 9.6.1) && impl(ghc < 9.7.0) + if !flag(ghc-lib) && impl(ghc >= 9.8.1) && impl(ghc < 9.9.0) build-depends: - ghc == 9.6.*, + ghc == 9.8.*, ghc-boot-th, ghc-boot else build-depends: - ghc-lib-parser == 9.6.* + ghc-lib-parser == 9.8.* build-depends: - ghc-lib-parser-ex >= 9.6.0.2 && < 9.6.1 + ghc-lib-parser-ex >= 9.8.0.0 && < 9.8.1 if flag(gpl) build-depends: hscolour >= 1.21 diff --git a/src/Config/Yaml.hs b/src/Config/Yaml.hs index 71e23229d..4532f68b2 100644 --- a/src/Config/Yaml.hs +++ b/src/Config/Yaml.hs @@ -163,7 +163,7 @@ parseFail (Val focus path) msg = fail $ -- aim to show a smallish but relevant context dotDot (fromMaybe (encode focus) $ listToMaybe $ dropWhile (\x -> BS.length x > 250) $ map encode contexts) where - (steps, contexts) = unzip $ reverse path + (steps, contexts) = Prelude.unzip $ reverse path dotDot x = let (a,b) = BS.splitAt 250 x in BS.unpack a ++ (if BS.null b then "" else "...") parseArray :: Val -> Parser [Val] diff --git a/src/GHC/Util/FreeVars.hs b/src/GHC/Util/FreeVars.hs index 8c6f2396b..de546d6a4 100644 --- a/src/GHC/Util/FreeVars.hs +++ b/src/GHC/Util/FreeVars.hs @@ -122,8 +122,8 @@ instance FreeVars (LocatedA (HsExpr GhcPs)) where freeVars (L _ (RecordCon _ _ (HsRecFields flds _))) = Set.unions $ map freeVars flds -- Record construction. freeVars (L _ (RecordUpd _ e flds)) = case flds of - Left fs -> Set.unions $ freeVars e : map freeVars fs - Right ps -> Set.unions $ freeVars e : map freeVars ps + RegularRecUpdFields _ fs -> Set.unions $ freeVars e : map freeVars fs + OverloadedRecUpdFields _ ps -> Set.unions $ freeVars e : map freeVars ps freeVars (L _ (HsMultiIf _ grhss)) = free (allVars grhss) -- Multi-way if. freeVars (L _ (HsTypedBracket _ e)) = freeVars e freeVars (L _ (HsUntypedBracket _ (ExpBr _ e))) = freeVars e @@ -174,7 +174,7 @@ instance FreeVars (LocatedA (HsFieldBind (LocatedAn NoEpAnns (FieldOcc GhcPs)) ( freeVars o@(L _ (HsFieldBind _ _ x _)) = freeVars x instance FreeVars (LocatedA (HsFieldBind (LocatedAn NoEpAnns (AmbiguousFieldOcc GhcPs)) (LocatedA (HsExpr GhcPs)))) where - freeVars (L _ (HsFieldBind _ x _ True)) = Set.singleton $ rdrNameOcc $ rdrNameAmbiguousFieldOcc $ unLoc x -- a pun + freeVars (L _ (HsFieldBind _ x _ True)) = Set.singleton $ rdrNameOcc $ ambiguousFieldOccRdrName $ unLoc x -- a pun freeVars (L _ (HsFieldBind _ _ x _)) = freeVars x instance FreeVars (LocatedA (HsFieldBind (LocatedAn NoEpAnns (FieldLabelStrings GhcPs)) (LocatedA (HsExpr GhcPs)))) where diff --git a/src/GHC/Util/HsExpr.hs b/src/GHC/Util/HsExpr.hs index 5a87a6452..e9396bc09 100644 --- a/src/GHC/Util/HsExpr.hs +++ b/src/GHC/Util/HsExpr.hs @@ -58,7 +58,7 @@ dotApps (x : xs) = dotApp x (dotApps xs) -- | @lambda [p0, p1..pn] body@ makes @\p1 p1 .. pn -> body@ lambda :: [LPat GhcPs] -> LHsExpr GhcPs -> LHsExpr GhcPs -lambda vs body = noLocA $ HsLam noExtField (MG Generated (noLocA [noLocA $ Match EpAnnNotUsed LambdaExpr vs (GRHSs emptyComments [noLocA $ GRHS EpAnnNotUsed [] body] (EmptyLocalBinds noExtField))])) +lambda vs body = noLocA $ HsLam noExtField (MG (Generated DoPmc) (noLocA [noLocA $ Match EpAnnNotUsed LambdaExpr vs (GRHSs emptyComments [noLocA $ GRHS EpAnnNotUsed [] body] (EmptyLocalBinds noExtField))])) -- | 'paren e' wraps 'e' in parens if 'e' is non-atomic. paren :: LHsExpr GhcPs -> LHsExpr GhcPs @@ -242,7 +242,7 @@ niceLambdaR ss e = let grhs = noLocA $ GRHS EpAnnNotUsed [] e :: LGRHS GhcPs (LHsExpr GhcPs) grhss = GRHSs {grhssExt = emptyComments, grhssGRHSs=[grhs], grhssLocalBinds=EmptyLocalBinds noExtField} match = noLocA $ Match {m_ext=EpAnnNotUsed, m_ctxt=LambdaExpr, m_pats=map strToPat ss, m_grhss=grhss} :: LMatch GhcPs (LHsExpr GhcPs) - matchGroup = MG {mg_ext=Generated, mg_alts=noLocA [match]} + matchGroup = MG {mg_ext=Generated DoPmc, mg_alts=noLocA [match]} in (noLocA $ HsLam noExtField matchGroup, const []) @@ -252,7 +252,7 @@ replaceBranches :: LHsExpr GhcPs -> ([LHsExpr GhcPs], [LHsExpr GhcPs] -> LHsExpr replaceBranches (L l (HsIf _ a b c)) = ([b, c], \[b, c] -> L l (HsIf EpAnnNotUsed a b c)) replaceBranches (L s (HsCase _ a (MG FromSource (L l bs)))) = - (concatMap f bs, L s . HsCase EpAnnNotUsed a . MG Generated . L l . g bs) + (concatMap f bs, L s . HsCase EpAnnNotUsed a . MG (Generated DoPmc). L l . g bs) where f :: LMatch GhcPs (LHsExpr GhcPs) -> [LHsExpr GhcPs] f (L _ (Match _ CaseAlt _ (GRHSs _ xs _))) = [x | (L _ (GRHS _ _ x)) <- xs] diff --git a/src/Hint/Export.hs b/src/Hint/Export.hs index 5f08dfc89..bc029cbae 100644 --- a/src/Hint/Export.hs +++ b/src/Hint/Export.hs @@ -23,7 +23,7 @@ import GHC.Types.Name.Reader exportHint :: ModuHint exportHint _ (ModuleEx (L s m@HsModule {hsmodName = Just name, hsmodExports = exports}) ) | Nothing <- exports = - let r = o{ hsmodExports = Just (noLocA [noLocA (IEModuleContents EpAnnNotUsed name)] )} in + let r = o{ hsmodExports = Just (noLocA [noLocA (IEModuleContents (Nothing, EpAnnNotUsed) name)] )} in [(ignore "Use module export list" (L s o) (noLoc r) []){ideaNote = [Note "an explicit list is usually better"]}] | Just (L _ xs) <- exports , mods <- [x | x <- xs, isMod x] @@ -32,7 +32,7 @@ exportHint _ (ModuleEx (L s m@HsModule {hsmodName = Just name, hsmodExports = ex , exports' <- [x | x <- xs, not (matchesModName modName x)] , modName `elem` names = let dots = mkRdrUnqual (mkVarOcc " ... ") - r = o{ hsmodExports = Just (noLocA (noLocA (IEVar noExtField (noLocA (IEName noExtField (noLocA dots)))) : exports') )} + r = o{ hsmodExports = Just (noLocA (noLocA (IEVar Nothing (noLocA (IEName noExtField (noLocA dots)))) : exports') )} in [ignore "Use explicit module export list" (L s o) (noLoc r) []] where diff --git a/src/Hint/Extensions.hs b/src/Hint/Extensions.hs index f1cec6cc1..2690ffb11 100644 --- a/src/Hint/Extensions.hs +++ b/src/Hint/Extensions.hs @@ -274,6 +274,7 @@ import Refact.Types import Data.Set qualified as Set import Data.Map qualified as Map +import GHC.Data.FastString import GHC.Types.SrcLoc import GHC.Types.SourceText import GHC.Hs @@ -492,8 +493,8 @@ used MultiWayIf = hasS isMultiIf used NumericUnderscores = hasS f where f :: OverLitVal -> Bool - f (HsIntegral (IL (SourceText t) _ _)) = '_' `elem` t - f (HsFractional (FL (SourceText t) _ _ _ _)) = '_' `elem` t + f (HsIntegral (IL (SourceText t) _ _)) = '_' `elem` unpackFS t + f (HsFractional (FL (SourceText t) _ _ _ _)) = '_' `elem` unpackFS t f _ = False used LambdaCase = hasS isLCase diff --git a/src/Hint/Lambda.hs b/src/Hint/Lambda.hs index c0f9270d2..73b9e10b3 100644 --- a/src/Hint/Lambda.hs +++ b/src/Hint/Lambda.hs @@ -170,7 +170,7 @@ lambdaBind where reform :: [LPat GhcPs] -> LHsExpr GhcPs -> Located (HsDecl GhcPs) reform ps b = L (combineSrcSpans (locA loc1) (locA loc2)) $ ValD noExtField $ - origBind {fun_matches = MG Generated (noLocA [noLocA $ Match EpAnnNotUsed ctxt ps $ GRHSs emptyComments [noLocA $ GRHS EpAnnNotUsed [] b] $ EmptyLocalBinds noExtField])} + origBind {fun_matches = MG (Generated DoPmc) (noLocA [noLocA $ Match EpAnnNotUsed ctxt ps $ GRHSs emptyComments [noLocA $ GRHS EpAnnNotUsed [] b] $ EmptyLocalBinds noExtField])} mkSubtsAndTpl newPats newBody = (sub, tpl) where diff --git a/src/Hint/ListRec.hs b/src/Hint/ListRec.hs index f3de15526..dd499921d 100644 --- a/src/Hint/ListRec.hs +++ b/src/Hint/ListRec.hs @@ -176,7 +176,7 @@ findCase x = do gRHS e = noLocA $ GRHS EpAnnNotUsed [] e :: LGRHS GhcPs (LHsExpr GhcPs) -- Guarded rhs. gRHSSs e = GRHSs emptyComments [gRHS e] emptyLocalBinds -- Guarded rhs set. match e = Match{m_ext=EpAnnNotUsed,m_pats=ps12, m_grhss=gRHSSs e, ..} -- Match. - matchGroup e = MG{mg_alts=noLocA [noLocA $ match e], mg_ext=Generated, ..} -- Match group. + matchGroup e = MG{mg_alts=noLocA [noLocA $ match e], mg_ext=Generated DoPmc, ..} -- Match group. funBind e = FunBind {fun_matches=matchGroup e, ..} :: HsBindLR GhcPs GhcPs -- Fun bind. pure (ListCase ps b1 (x, xs, b2), noLocA . ValD noExtField . funBind) diff --git a/src/Hint/Monad.hs b/src/Hint/Monad.hs index 911ca4ad5..9aa365e5e 100644 --- a/src/Hint/Monad.hs +++ b/src/Hint/Monad.hs @@ -372,7 +372,7 @@ monadLet xs = mapMaybe mkLet xs grhs = noLocA (GRHS EpAnnNotUsed [] rhs) grhss = GRHSs emptyComments [grhs] (EmptyLocalBinds noExtField) match = noLocA $ Match EpAnnNotUsed (FunRhs p Prefix NoSrcStrict) [] grhss - fb = noLocA $ FunBind noExtField p (MG Generated (noLocA [match])) + fb = noLocA $ FunBind noExtField p (MG (Generated DoPmc) (noLocA [match])) binds = unitBag fb valBinds = ValBinds NoAnnSortKey binds [] localBinds = HsValBinds EpAnnNotUsed valBinds diff --git a/src/Hint/Naming.hs b/src/Hint/Naming.hs index fccfc295a..0d4f313ad 100644 --- a/src/Hint/Naming.hs +++ b/src/Hint/Naming.hs @@ -102,7 +102,7 @@ shortenLGRHS (L locGRHS (GRHS ttg0 guards (L locExpr _))) = L locGRHS (GRHS ttg0 guards (L locExpr dots)) where dots :: HsExpr GhcPs - dots = HsLit EpAnnNotUsed (HsString (SourceText "...") (mkFastString "...")) + dots = HsLit EpAnnNotUsed (HsString (SourceText (fsLit "...")) (fsLit "...")) getNames :: LHsDecl GhcPs -> [String] getNames decl = maybeToList (declName decl) ++ getConstructorNames (unLoc decl) diff --git a/src/Hint/NumLiteral.hs b/src/Hint/NumLiteral.hs index c740f76ac..05bc0e0d9 100644 --- a/src/Hint/NumLiteral.hs +++ b/src/Hint/NumLiteral.hs @@ -22,6 +22,7 @@ module Hint.NumLiteral (numLiteralHint) where import GHC.Hs +import GHC.Data.FastString import GHC.LanguageExtensions.Type (Extension (..)) import GHC.Types.SrcLoc import GHC.Types.SourceText @@ -49,18 +50,20 @@ numLiteralHint _ modu = suggestUnderscore :: LHsExpr GhcPs -> [Idea] suggestUnderscore x@(L _ (HsOverLit _ ol@(OverLit _ (HsIntegral intLit@(IL (SourceText srcTxt) _ _))))) = - [ suggest "Use underscore" (reLoc x) (reLoc y) [r] | '_' `notElem` srcTxt, srcTxt /= underscoredSrcTxt ] + [ suggest "Use underscore" (reLoc x) (reLoc y) [r] | '_' `notElem` srcTxt', srcTxt' /= underscoredSrcTxt ] where - underscoredSrcTxt = addUnderscore srcTxt + srcTxt' = unpackFS srcTxt + underscoredSrcTxt = addUnderscore srcTxt' y :: LocatedAn an (HsExpr GhcPs) - y = noLocA $ HsOverLit EpAnnNotUsed $ ol{ol_val = HsIntegral intLit{il_text = SourceText underscoredSrcTxt}} + y = noLocA $ HsOverLit EpAnnNotUsed $ ol{ol_val = HsIntegral intLit{il_text = SourceText (fsLit underscoredSrcTxt)}} r = Replace Expr (toSSA x) [("a", toSSA y)] "a" suggestUnderscore x@(L _ (HsOverLit _ ol@(OverLit _ (HsFractional fracLit@(FL (SourceText srcTxt) _ _ _ _))))) = - [ suggest "Use underscore" (reLoc x) (reLoc y) [r] | '_' `notElem` srcTxt, srcTxt /= underscoredSrcTxt ] + [ suggest "Use underscore" (reLoc x) (reLoc y) [r] | '_' `notElem` srcTxt', srcTxt' /= underscoredSrcTxt ] where - underscoredSrcTxt = addUnderscore srcTxt + srcTxt' = unpackFS srcTxt + underscoredSrcTxt = addUnderscore srcTxt' y :: LocatedAn an (HsExpr GhcPs) - y = noLocA $ HsOverLit EpAnnNotUsed $ ol{ol_val = HsFractional fracLit{fl_text = SourceText underscoredSrcTxt}} + y = noLocA $ HsOverLit EpAnnNotUsed $ ol{ol_val = HsFractional fracLit{fl_text = SourceText (fsLit underscoredSrcTxt)}} r = Replace Expr (toSSA x) [("a", toSSA y)] "a" suggestUnderscore _ = mempty diff --git a/src/Hint/Unsafe.hs b/src/Hint/Unsafe.hs index 642b65e89..714bf7f3b 100644 --- a/src/Hint/Unsafe.hs +++ b/src/Hint/Unsafe.hs @@ -60,13 +60,15 @@ unsafeHint _ (ModuleEx (L _ m)) = \ld@(L loc d) -> -- 'x' is not marked 'NOINLINE'. , x `notElem` noinline] where + noInline :: FastString + noInline = fsLit $ "{-# NOINLINE" gen :: OccName -> LHsDecl GhcPs gen x = noLocA $ SigD noExtField (InlineSig EpAnnNotUsed (noLocA (mkRdrUnqual x)) - (InlinePragma (SourceText "{-# NOINLINE") (NoInline (SourceText "{-# NOINLINE")) Nothing NeverActive FunLike)) + (InlinePragma (SourceText noInline) (NoInline (SourceText noInline)) Nothing NeverActive FunLike)) noinline :: [OccName] noinline = [q | L _(SigD _ (InlineSig _ (L _ (Unqual q)) - (InlinePragma _ (NoInline (SourceText "{-# NOINLINE")) Nothing NeverActive FunLike)) + (InlinePragma _ (NoInline (SourceText noInline)) Nothing NeverActive FunLike)) ) <- hsmodDecls m] isUnsafeDecl :: HsDecl GhcPs -> Bool diff --git a/stack.yaml b/stack.yaml index 6be28defc..b6aaeff4b 100644 --- a/stack.yaml +++ b/stack.yaml @@ -1,12 +1,12 @@ -# For hlint/ghc-9.6.*, the minimum build compiler is ghc-9.2.2 (ghc-9.2.1 was a broken release). 9.2.2 exhibits the "'ffitarget_x86.h' file not found" problem on macOS. in this case, build with invoke `C_INCLUDE_PATH="$(xcrun --show-sdk-path)"/usr/include/ffi stack build`. -resolver: nightly-2023-04-02 # ghc-9.4.4 +# For hlint/ghc-9.8.*, the minimum build compiler is ghc-9.4.1. +resolver: lts-21.6 # ghc-9.4.5 packages: - . extra-deps: - - ghc-lib-parser-9.6.2.20230523 - - ghc-lib-parser-ex-9.6.0.2 + - ghc-lib-parser-9.8.1.20231009 + - ghc-lib-parser-ex-9.8.0.0 # To test hlint against experimental builds of ghc-lib-parser-ex, # modify extra-deps like this: # - archive: /users/shayne/project/ghc-lib-parser-ex/ghc-lib-parser-ex-8.10.0.18.tar.gz